我想了解我们是否可以从ZViewModel更新XView datacontext?
我有一个XView,在加载时它绑定到它的DataContext绑定到它的XViewModel。
在ZViewModel中,我创建了一个新的XViewModel实例,并希望使用这个新的XViewModel更新XView的datacontext。
我可以这样做吗?有什么想法吗?
答案 0 :(得分:0)
回答你的问题:据我所知。
此外,它有点违背MVVM的原则,使ViewModel"查找"进入一个视图。
如果你试图从根本上改变XViewModel中的一些数据集,你可能会查看MVVM Light中的Event Bus。它可以让一个VM订阅某种类型的消息,并在收到该消息时执行某些操作。
你可以,实际上:
美丽的是,VM都不知道对方。它通过总线完全解耦。
答案 1 :(得分:0)
如果您的视图是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}}" />