我想了解我们是否可以从ZViewModel更新XView数据环境?如何从完全不同的视图模型更新视图的datacontext
我有一个XView并加载它绑定到它的DataContext绑定到它的XViewModel。
在ZViewModel中,我创建了一个XViewModel的新实例,并希望用这个新的XViewModel更新XView的datacontext。
我可以这样做吗?请有任何想法吗?
我想了解我们是否可以从ZViewModel更新XView数据环境?如何从完全不同的视图模型更新视图的datacontext
我有一个XView并加载它绑定到它的DataContext绑定到它的XViewModel。
在ZViewModel中,我创建了一个XViewModel的新实例,并希望用这个新的XViewModel更新XView的datacontext。
我可以这样做吗?请有任何想法吗?
回答你的问题:并不是我所知道的。
此外,它有点违背MVVM的原则,让ViewModel“仰视”视图。
如果您试图从根本上更改XViewModel中的某些数据集,则可以查看MVVM Light中的Event Bus。它可以让一个虚拟机订阅某种类型的消息,并在收到该消息时执行一些操作。
,你可以在效果:
美的是,两个VM都不知道另一个。它通过总线完全解耦。
如果你的视图是一个UserControl,这很容易。您可以将DataContext的绑定设置为ViewModel中的属性。单击该按钮本质上会将UserControl重置为默认状态。
<Window
//usual Window declarations>
<Grid x:Name="LayoutRoot">
<view:MyView DataContext="{Binding MyViewModelProperty}" />
<Button Command="{Binding CmdChangeViewModel}"
Content="Change VM" />
</Grid>
</Window>
MainViewModel:
private IViewModelBase _MyViewModelProperty;
public IViewModelBase MyViewModelProperty
{
get { return _MyViewModelProperty; }
set { Set("MyViewModelProperty", ref _MyViewModelProperty, value); }
}
public ICommand CmdChangeViewModel
{
get
{
return new RelayCommand(() =>
{
MyViewModelProperty = new MyViewModel();
});
}
}
如果你的观点是另一个窗口,那么你就需要使用ViewModelLocator。我使用MVVM Light中的那个。使用上面的MainViewModel,单击主视图中的按钮将更改另一个窗口的DataContext。
子窗口:
<Window
//usual Window declarations
DataContext="{Binding Main.MyViewModelProperty, Source={StaticResource Locator}}" />