单个视图中视图模型之间的WPF MvvM通信

本文关键字:视图 WPF MvvM 通信 之间 模型 单个 | 更新日期: 2023-09-27 18:18:27

这个标题可能不适合提问本身,但请留下来,如果你有更好的建议,我会改变它。这是我的第一个wpf应用程序,所以我可能错过了一些关键概念……我做了谷歌,但我没有找到正确的方法。

我正在使用MvvM Light和MUI构建wpf应用程序,我遇到了项目绑定的麻烦,即视图模型之间的通信。现在,我确信我不会有这个问题,如果我使用单一的视图模型的页面和所有的用户控件在它,但我认为我做过头了,我的第一次尝试。

我有一个主窗口在应用程序和页面作为用户控件。在每个页面中,我都有其他几个用户控件,每个控件都有自己的视图模型和自己的逻辑来做事情,但最终它们都依赖于具有数据网格的相应VM。我们可以把它们看作是可怜的角指令。每个用户控件都有其数据上下文定义,如下所示:

DataContext="{Binding ViewModelName, Source={StaticResource Locator}}

布局看起来像这样这样看,VM1中的DG1是Master(客户),UC3和UC4是Details(订单)。如果我向客户添加新订单,我希望它在DG1中更新,而不刷新整个网格。

在VM1数据网格1选择改变了,我正在发射命令来设置依赖用户控件的属性值。

<i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectionChanged">
                <mvvm:EventToCommand Command="{Binding ErrorWorkflow.GetErrorWorkflowCommand, Mode=OneWay, Source={StaticResource Locator}}" CommandParameter="{Binding SelectedError.WF_REF}" />
                <mvvm:EventToCommand Command="{Binding ErrorDetails.GetErrorCaseDetailsCommand, Mode=OneWay, Source={StaticResource Locator}}" CommandParameter="{Binding SelectedError}" />
             </i:EventTrigger>
        </i:Interaction.Triggers>

该部分工作正常,但是当我改变VM3和VM1的依赖VM3的值时,VM1属性值不会改变,即使我调用RaisePropertyChanged或像SelectedError那样手动显式设置属性。Status = " somethingnew " .

另一方面,如果我从数据网格中清除选择,则根据视图模型保持绑定(它们上的文本框保留值,因为它们在自己的VM3上引用属性)。

所有视图模型都来自mvvmLight的ViewModelBase和来自ObservableObjects的所有模型(我知道我应该使用Poco,但显然我必须在VM上创建每个属性)。例子:

        public const string SelectedErrorPropertyName = "SelectedError";
    private ErrorLog _selectedError;
    public ErrorLog SelectedError
    {
        get
        {
            return _selectedError;
        }
        set
        {
            Set(() => SelectedError, ref _selectedError, value);
        }
    }

考虑到应用程序的大小(只有几个像这样的页面),我认为Messenger是多余的。

我应该改变页面只使用一个视图模型,并为每个用户控件共享它们,还是我在这里错过了一些明显的东西?如果你认为我在这个例子中遗漏了一些关键信息,请告诉我,我会更新的。

提前感谢您的任何建议,干杯!

单个视图中视图模型之间的WPF MvvM通信

不应该将页面更改为只有一个视图模型和Messenger不是多余的。MVVM Light Messenger的构建是为了精确地解决您目前所遇到的问题(vm之间的通信)。你应该用它。

关于MVVM Light中的消息传递的更多信息,Microsoft的Jesse Liberty有一个关于如何使用它的很棒的教程。