MVVM:从XAML设置ViewModel导致错误,而代码隐藏不会

时间:2016-05-10 06:57:51

标签: c# wpf mvvm

我从不同的应用程序启动一个Window。每当我启动Window时,都是从不同的线程完成的。我第一次启动Window时,一切正常。以后的每次尝试都会失败并显示错误:The calling thread cannot access this object because a different thread owns it.

我曾经在Xaml中分配DataContext,如下所示:

<UserControl.DataContext>
    <viewModels:MyViewModel/>
</UserControl.DataContext>

错误停止了,当我更改错误时,从后面的代码中分配ViewModel,如下所示:

public MyView() {
    InitializeComponent();
    DataContext = new MyViewModel();
}

根据answer at MSDN,这两种方法应该是等价的。

为什么我会得到不同的结果?有没有办法让我的第一个方法工作(我喜欢它)?

修改

控件在另一个Xaml中初始化:

<userControls:MyView Grid.Column="2" x:Name="MyView" Grid.ColumnSpan="1" ></userControls:MyView>

窗口本身使用

启动
AutoResetEvent are = new AutoResetEvent(false);
Thread thread = new Thread(() => {
    MyMainWindow form = new MyMainWindow(someObject);
    form.Closed += (sender2, e2) => {
        Dispatcher.CurrentDispatcher.InvokeShutdown();
        are.Set();
    };
    form.Show();
    Dispatcher.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
are.WaitOne();

编辑2:

经过一些调试后,我找到了根本原因。我正在使用基于Prism Event Aggregator的消息传递系统的自定义实现。当MyMainWindow关闭时,我没有清除所有订阅。

0 个答案:

没有答案