ビュー モデルを介して UI にバインドされた (非揮発性) データがあり、何もロックせずにバックグラウンド スレッドからこのデータを更新し、PropertyChanged
イベントをトリガーした場合、 UI がこの更新を確認することは保証されますか? もしそうなら、なぜですか?
CLRBindingWorker
呼び出していることがわかりDispatcher.BeginInvoke
、プロパティが UI スレッドから読み取られていることを確認できます。私が知りたいのは、UI スレッドでプロパティ値が常に「新鮮」であるかどうかです (たとえば、http://www.yoda.arachsys.com/csharp/threads/volatility.shtmlのようなシナリオが発生する可能性があるかどうか)。
以前の回答では、これが実際に当てはまることを示唆していましたが、説明はありません。
例:
public class MyViewModel : INotifyPropertyChanged
{
// Bound to the view as <TextBlock Text="{Binding Data}" />
private long _data;
public long Data
{
get { return _data; }
set
{
_data = value;
FirePropertyChanged("Data");
}
}
public MyViewModel()
{
new Thread(Updater).Start();
}
private void Updater()
{
while (true)
{
Data++;
Thread.Sleep(1000);
}
}
private void FirePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
}