在MVVM中使用WPF不需要Dispatcher吗?

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)

MVVM

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)

Pau*_*ell 7

任何更新UI的尝试都必须在调度程序线程中完成.但是,对于属性更改事件,当从后台线程引发事件时,WPF会自动为您分派.您可以在Bea Costa(以前的WPF数据绑定PM)博客上阅读更多相关信息:

http://bea.stollnitz.com/blog/?p=34

他们将为INotifyCollectionChanged事件做同样的事情,但在以前的版本中从未接触到它.4.5 它们现在将自动同步采集改变事件除了INotifyPropertyChanged.