diff --git a/CommunityToolkit.Authentication/ProviderManager.cs b/CommunityToolkit.Authentication/ProviderManager.cs index b4f82ef..c0a69b4 100644 --- a/CommunityToolkit.Authentication/ProviderManager.cs +++ b/CommunityToolkit.Authentication/ProviderManager.cs @@ -8,14 +8,14 @@ namespace CommunityToolkit.Authentication { /// - /// Shared provider manager used by controls in Microsoft.Toolkit.Graph.Controls to authenticate and call the Microsoft Graph. + /// Shared provider manager used by controls and helpers to authenticate and call the Microsoft Graph. /// /// To set your own existing provider: /// - /// ProviderManager.Instance.GlobalProvider = await MsalProvider.CreateAsync(...); + /// ProviderManager.Instance.GlobalProvider = await new MsalProvider(clientId, scopes); /// /// - public partial class ProviderManager + public partial class ProviderManager : INotifyPropertyChanged { /// /// Gets the name of the toolkit client to identify self in Graph calls. @@ -37,7 +37,8 @@ public partial class ProviderManager /// public event EventHandler ProviderStateChanged; - private IProvider _provider; + /// + public event PropertyChangedEventHandler PropertyChanged; /// /// Gets or sets the global provider used by all Microsoft.Toolkit.Graph.Controls. @@ -54,7 +55,7 @@ public IProvider GlobalProvider var oldState = _provider?.State; if (_provider != null) { - _provider.StateChanged -= ProviderStateChanged; + _provider.StateChanged -= OnProviderStateChanged; } _provider = value; @@ -62,17 +63,33 @@ public IProvider GlobalProvider var newState = _provider?.State; if (_provider != null) { - _provider.StateChanged += ProviderStateChanged; + _provider.StateChanged += OnProviderStateChanged; } ProviderUpdated?.Invoke(this, _provider); ProviderStateChanged?.Invoke(this, new ProviderStateChangedEventArgs(oldState, newState)); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(GlobalProvider))); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(State))); } } + /// + /// Gets the ProviderState of the current GlobalProvider instance. + /// Use for binding scenarios instead of ProviderManager.Instance.GlobalProvider.State. + /// + public ProviderState? State => GlobalProvider?.State; + + private IProvider _provider; + private ProviderManager() { // Use Instance } + + private void OnProviderStateChanged(object sender, ProviderStateChangedEventArgs args) + { + ProviderStateChanged?.Invoke(sender, args); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(State))); + } } }