【问题标题】:Reflect property change from one ViewModel to another反映从一个 ViewModel 到另一个 ViewModel 的属性更改
【发布时间】:2011-06-06 05:23:05
【问题描述】:

我有一个带有一堆选项卡的 TabControl 的 WPF/MVVM 应用程序。加载应用程序时,会加载所有选项卡的数据。在 Tab1 上进行了一些计算,这些计算取决于 Tab2 中的值。发生的事情是,当我在 tab2 上输入/更改数据时,当我单击 Tab1 时,它根本不会反映在 Tab1 上。在引擎盖下,计算是正确的,但它没有反映在 tab1 上。我必须转到主选项卡以重新加载所有数据以反映更改。任何想法如何实现这一点?

【问题讨论】:

  • 您是否为相关的数据绑定属性实现了 INotifyPropertyChanged?
  • 如果不看一些代码,很难自信地回答这个问题。创建一个新的测试项目并为您要实现的目标进行非常简单的概念证明是一个好主意(即,您可能在 tab1 上有一个 TextBlock,显示来自 tab2 上的 TextBox 的值)。 10 次中有 9 次你会自己找到解决方案,但如果你不这样做,你可以发布代码,这里的人可以让你走上正确的轨道。
  • 我确实实现了 INotifyPropertyChanged。它反映了我所在选项卡上的更改。意思是,当我在 Tab2 中输入值时,我会得到反映在视图上的结果。但我需要在第一个选项卡上完成。我知道很难在不查看代码的情况下提出任何建议。但我不会离开公司。
  • 我明白,但您可以创建一个小型测试应用程序并从中发布代码。

标签: wpf mvvm viewmodel


【解决方案1】:

您需要在视图模型数据属性上实现INotifyPropertyChanged。然后,让您的视图模型订阅事件(视图模型构造函数调用Initialize() 方法):

private void Initialize()
{

    // Subscribe to events
    this.PropertyChanging += OnPropertyChanging;
    this.PropertyChanged += OnPropertyChanged;
    this.Books.CollectionChanging += OnBooksCollectionChanging;
}

然后,事件的视图模型处理程序可以更新任何需要更新的属性:

void OnPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    switch(e.PropertyName)
    {
        case "FirstProperty":
             this.SomeOtheProperty = whatever;
            break;

        case "Another property":
            this.YetAnotherProperty = somethingElse;
            break;
    }
}

这应该可以完成工作。

【讨论】:

    【解决方案2】:

    如果两个不同的 ViewModel 需要显示相同的数据/值,它们应该绑定到相同的 ViewModel。

    我认为在 ViewModel 之间添加绑定是不好的,因为它引入了很多依赖项。

    如果单个 ViewModel 的属性依赖于 same ViewModel 的其他属性,您可以使用 David 的回答中提到的属性更改通知。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多