创建接收消息的视图

时间:2016-05-26 13:28:31

标签: c# wpf mvvm

我有MVVM视图和viewmodel。在我的viewmodel的构造函数中,我传递了一个IObservable消息列表,并通过一个简单的类来订阅它们,这个类坐在我的viewmodel和view视图中

课外

{
     viewModel =
            new ViewModelClass(
                responseHandler.AsObservable());

     viewModel.PropertyChanged += ViewModel_PropertyChanged;
 }

 private void ViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
 {

     if (e.PropertyName == nameof(ViewModelClass.MyProperty))
     {
         // Error here
         view = new MyViewClass() { DataContext = viewModel };

     }
 }

在视图模型构造函数中

        subscription = receiveMessages.Subscribe(MessageReceived);

        private void MessageReceived(GvsMessage message)
        {
            MyProperty = true;

        }

收到消息后,我想在此之前创建我的视图。尽管在处理属性更改等之前创建了viewmodel

问题是我得到了#34;调用线程必须是sta,因为许多ui组件需要这个"。请有人帮忙

2 个答案:

答案 0 :(得分:0)

正如我们在评论中所说,您需要使用可从应用的不同部分获取的request.setCharacterEncoding("UTF-8")
要初始化调度程序,您可以使用以下代码段:

Dispatcher

<强>解释
第一个调度程序在应用程序运行测试protected static Dispatcher _d; if (Application.Current != null) { _d = Application.Current.Dispatcher; } else { _d = Dispatcher.CurrentDispatcher; } 时完成,此调度程序不为空, 第二个是您的申请使用的当前UnitTests 现在,在初始化Dispatcher时,您可以在代码中使用此代码,然后将消息VMActions发送到UI主题。
我有一个小方法:

Events

此函数将接受lambda,如下所示:

public static void UIThread(Action action)
    {
        if (_d == null)
        {
            if (Application.Current != null)
            {
                _d = Application.Current.Dispatcher;
            }
            else
            {
                _d = Dispatcher.CurrentDispatcher;
            }
        }
        _d.Invoke(action);
    }  

这样,您在视图中UIThread(() => { Processing = true; Message = "Working ..."; //in your case you would raise the Loaded event here }); 就可以毫无问题地显示该视图 如果您需要更多信息,请告知我们。
HTH

答案 1 :(得分:0)

我通过在构造函数中创建视图和viewmodel来解决这个问题。在propertychanged事件中,我只是将属性IsVisible设置为&#39; true&#39;绑定窗口可见性

<Window.Visibility>
    <Binding Path="IsVisible" Converter="{StaticResource BoolToVisibilityConverter}" Mode="TwoWay"/>
</Window.Visibility>