从中央数据源在MVVM中创建tabcontrol

时间:2010-11-09 20:27:12

标签: wpf mvvm synchronization tabcontrol

我是MVVM的新手,我正在尝试按照模式实现一个简单的应用程序。

为简单起见,我将问题分解为最简单的形式。如果我设法让这个工作,我将很难得到申请。

简单的应用程序包含一个tabcontrol。两个选项卡都有自己的ViewModel非常重要。但是,他们将从同一来源获得大部分数据。主要问题是让第二个选项卡知道第一个选项卡已经启动了对数据源的更改。

因此,为简单起见,我们只说模型持有一个整数。该整数最初需要设置为1.

第一个标签是一个文本块和一个按钮。 textblock的文本绑定到datamodel中的整数。按下按钮后,moddel中的整数应增加1。

第二个选项卡仅包含一个文本块,也绑定到数据模型中的整数。挑战是让这个文本块与第一个文本块一起更新,但仍然是它自己的viewmodel。

我需要一个中心位置来存储模型的值,并且在某种程度上,让视图模型知道它们已经更新,因此可以更新它们的属性,因此视图会相应地更新。

有人可以尽可能详细地解释这是如何完成的吗?我已经尝试了十亿种不同的方式,但我没有让它发挥作用。

3 个答案:

答案 0 :(得分:1)

让我看看我的问题是否正确:

  • 您有一个数据源(您的模型)。
  • 您有2个视图模型。
  • 查看模型1会更改模型中的数据。
  • 查看模型2需要使用模型中的更改进行更新。

如果一切听起来都合适,这是一个解决方案:

让您的模型实现INotifyPropertyChanged。当整数更改时,引发PropertyChanged事件。在视图模型2中,侦听模型的PropertyChanged事件。当它发生时,引发视图模型2的属性更改事件,其UI将自动更新。

答案 1 :(得分:0)

我不知道你想在哪种情况下这样做。 但是我想到的解决方案是拥有一个“父”ViewModel,它可以保存两个选项卡ViewModel的实例。

e.g。

public class ParentViewModel{

   private Tab1ViewModel viewModel1;
   private Tab2ViewModel viewModel2;
}

然后ParentViewModel可以订阅ViewModel1的INotifyPropertyChanged事件,并在ViewModel2上设置值。

答案 2 :(得分:0)

我最近实施了类似的东西。它用于实现向导,包括:

  • 7意见
  • 8查看模型
  • 1型号

主ViewModel创建了Model,并通过它们的构造函数将其传递给所有其他视图模型。

在您的场景中,您可以拥有一个带有ViewModel的ObservableCollection的主ViewModel。这些VM中的每一个都具有与其数据源相同的模型实例。

如前所述,在模型上实现INotifyPropertyChanged,并通过ViewModel上的属性将视图直接绑定到模型。我发现这个图非常有用:http://karlshifflett.files.wordpress.com/2009/01/wpflobmvvm1.png