Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何从完全不同的视图模型更新视图的datacontext_Wpf_Mvvm - Fatal编程技术网

Wpf 如何从完全不同的视图模型更新视图的datacontext

Wpf 如何从完全不同的视图模型更新视图的datacontext,wpf,mvvm,Wpf,Mvvm,我想了解我们是否可以从ZViewModel更新XView数据上下文 我有一个XView,加载时它绑定到它的DataContext,绑定到它的XView模型 在ZViewModel中,我创建了一个新的XViewModel实例,并希望用这个新的XViewModel更新XView的datacontext 我能做这个吗?有什么想法吗?回答你的问题:据我所知没有 此外,让ViewModel“向上看”视图有点违背MVVM的原则 如果您试图从根本上改变XViewModel中的某些数据集,您可以从MVVM的角度

我想了解我们是否可以从ZViewModel更新XView数据上下文

我有一个XView,加载时它绑定到它的DataContext,绑定到它的XView模型

在ZViewModel中,我创建了一个新的XViewModel实例,并希望用这个新的XViewModel更新XView的datacontext


我能做这个吗?有什么想法吗?

回答你的问题:据我所知没有

此外,让ViewModel“向上看”视图有点违背MVVM的原则

如果您试图从根本上改变XViewModel中的某些数据集,您可以从MVVM的角度来研究。它可以让一个VM订阅某种类型的消息,并在收到该消息时执行某些操作

实际上,你可以:

  • 为类型为T的消息设置XViewModel寄存器
  • 让ZViewModel在EventBus上传递类型为T的消息
  • XViewModel在收到ZViewModels消息时将执行一些处理程序

  • 美妙之处在于两个虚拟机都不知道另一个虚拟机。它通过总线完全解耦。

    如果您的视图是用户控件,那么这非常容易。可以将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,单击主视图中的按钮将更改另一个窗口的DataContext

    子窗口:

    <Window
       //usual Window declarations
       DataContext="{Binding Main.MyViewModelProperty, Source={StaticResource Locator}}" />
    
    
    
    <Window
       //usual Window declarations
       DataContext="{Binding Main.MyViewModelProperty, Source={StaticResource Locator}}" />