raj*_*net 2 wpf xaml multithreading dispatcher mvvm
我正在开始一个新的线程,并尝试通过我的View模型中定义的属性更新UI元素,我能够做到没有任何错误,但如果我尝试通过代码隐藏更新UI元素,它会抛出已知的UI访问错误("调用线程无法访问此对象,因为另一个线程拥有它.").第一个问题是......两种方法的区别是什么?第二个问题是我会在ViewModel中理想地使用Disptacher吗?
private void Button_Click(object sender, RoutedEventArgs e)
{
Thread th = new Thread(new ThreadStart(delegate()
{
textbox.Text = "Rajib";
}
));
th.Start();
}
//inside XAML
<TextBox x:Name="textbox" Text="{Binding UserInput, Mode=TwoWay}" />
Run Code Online (Sandbox Code Playgroud)
public string UserInput
{
get { return _UserInput; }
set { _UserInput = value; OnPropertyChanged("UserInput"); }
}
Run Code Online (Sandbox Code Playgroud)
//通过按钮上的ICommand属性调用单击public void ExecuteCommand(object obj){InvokeCallThroughAnonymousDelegateThread(); }
private void InvokeCallThroughAnonymousDelegateThread()
{
ThreadStart start = delegate()
{
UserInput = "Calling from diff thread";
};
new Thread(start).Start();
}
Run Code Online (Sandbox Code Playgroud)
任何更新UI的尝试都必须在调度程序线程中完成.但是,对于属性更改事件,当从后台线程引发事件时,WPF会自动为您分派.您可以在Bea Costa(以前的WPF数据绑定PM)博客上阅读更多相关信息:
http://bea.stollnitz.com/blog/?p=34
他们将为INotifyCollectionChanged事件做同样的事情,但在以前的版本中从未接触到它.4.5 它们现在将自动同步采集改变事件除了INotifyPropertyChanged.
| 归档时间: |
|
| 查看次数: |
3451 次 |
| 最近记录: |