0

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

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

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

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

布局是这样的:Wpf Layout 这样看,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 中为 VM3 和 VM1 更改值时,即使我调用 RaisePropertyChanged 或手动显式设置属性(如 SelectedError.Status = “somethingnew”),VM1 属性值也不会更改。

另一方面,如果我从数据网格中清除选择,则依赖的视图模型会保持绑定(它们上的文本框会保留值,因为它们引用了它们自己的 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 将是一种矫枉过正的工具(只有几页这样的页面)。

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

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

4

1 回答 1

1

永远不应该将页面更改为只有一个视图模型,而 Messenger 也不是矫枉过正。MVVM Light Messenger旨在解决您目前遇到的问题(VM 之间的通信)。你应该使用它。

有关 MVVM Light 中的消息传递的更多信息,Microsoft 的 Jesse Liberty 提供了关于如何使用它的精彩教程。

于 2014-08-19T06:11:19.253 回答