Skip to content

Instantly share code, notes, and snippets.

@pedrolamas
Last active March 21, 2018 11:27
Show Gist options
  • Save pedrolamas/3a3c97f1cff7058dad23cb8ea4ce3c05 to your computer and use it in GitHub Desktop.
Save pedrolamas/3a3c97f1cff7058dad23cb8ea4ce3c05 to your computer and use it in GitHub Desktop.
Base view model that can be used in multiple windows
public class MultiWindowViewModelBase : INotifyPropertyChanged
{
private readonly ConcurrentDictionary<CoreDispatcher, PropertyChangedEventHandler> _dispatchersAndHandlers = new ConcurrentDictionary<CoreDispatcher, PropertyChangedEventHandler>();
public event PropertyChangedEventHandler PropertyChanged
{
add
{
var dispatcher = Window.Current.Dispatcher;
_dispatchersAndHandlers.AddOrUpdate(
dispatcher,
(dispatcher2) => value,
(dispatcher2, handler2) => handler2 + value);
}
remove
{
var dispatcher = Window.Current.Dispatcher;
if (_dispatchersAndHandlers.TryRemove(dispatcher, out PropertyChangedEventHandler handler))
{
handler -= value;
if (handler != null)
{
_dispatchersAndHandlers.AddOrUpdate(
dispatcher,
(dispatcher2) => handler,
(dispatcher2, handler2) => handler2 + handler);
}
}
}
}
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var dispatchersAndHandlers = _dispatchersAndHandlers.ToArray();
var eventArgs = new PropertyChangedEventArgs(propertyName);
foreach (var dispatcherAndHandler in dispatchersAndHandlers)
{
var dispatcher = dispatcherAndHandler.Key;
var handler = dispatcherAndHandler.Value;
dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => handler(this, eventArgs));
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment