【问题标题】:WPF MvvM communication between view models in a single View单个视图中视图模型之间的 WPF MvvM 通信
【发布时间】:2014-10-11 16:36:20
【问题描述】:

这个标题可能不适合问题本身,但请留下来如果您有更好的建议,我会更改它。这是我的第一个 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 会有点过分(只有几个页面像这样)。

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

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

【问题讨论】:

  • 每个问题问 1 个问题。
  • Henk,感谢您的关注。现在,最后一段有一个问题。问候
  • 你的title还有2个。
  • 你杀了我 :) 这就是为什么我把第一行留在那里。

标签: c# wpf mvvm mvvm-light modern-ui


【解决方案1】:

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

有关 MVVM Light 中的消息传递的更多信息,Microsoft 的 Jesse Liberty 已通过a great tutorial 了解如何使用它。

【讨论】:

    猜你喜欢
    • 2014-07-10
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 2011-10-12
    • 2014-10-24
    相关资源
    最近更新 更多