using System; using System.Windows; using System.ComponentModel; using System.Windows.Threading; namespace SilverlightCairngorm { /// <summary> /// modestyZ: 2008.10 /// Abstract class that makes INotifyPropertyChanged implementation thread-safe /// Any type that serves as DataContext for data binding in a multi-threaded application should derive from this type /// </summary> public abstract class BindableBase : INotifyPropertyChanged { //the dispatcher to ensure the PropertyChange event will raised for UI thread to update bound data protected Dispatcher currentDispatcher; public BindableBase() : this(null) { } public BindableBase(Dispatcher uiDispatcher) { currentDispatcher = uiDispatcher; } #region INotifyPropertyChanged Members public event PropertyChangedEventHandler PropertyChanged = delegate { }; protected void NotifyPropertyChanged(string propertyName) { //the dispatcher initialization is deferred till the first PropertyChanged event raised CheckDispatcher(); //check if we are on the Dispatcher thread if not switch if (currentDispatcher.CheckAccess()) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); else currentDispatcher.BeginInvoke(new Action<string>(NotifyPropertyChanged), propertyName); } #endregion /// <summary> /// check and initialize the UI thread dispatcher when the custructor passed in null dispatcher instance /// </summary> protected void CheckDispatcher() { if (null != currentDispatcher) return; if (Application.Current != null && Application.Current.RootVisual != null && Application.Current.RootVisual.Dispatcher != null) { currentDispatcher = Application.Current.RootVisual.Dispatcher; } else // can't get the Dispatcher, throw an exception { throw new InvalidOperationException("CheckDispatcher must be invoked after that the RootVisual has been loaded"); } } } }
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.
This article, along with any associated source code and files, is licensed under The Common Development and Distribution License (CDDL)