我有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组件需要这个"。请有人帮忙
答案 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
时,您可以在代码中使用此代码,然后将消息VM
,Actions
发送到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>