MVVM使用相同ViewModel的新窗口

时间:2016-07-01 07:18:49

标签: wpf mvvm multiple-views

有没有办法让新窗口使用与MainWindow相同的ViewModel? 这样做的原因是我有一个我要插入的数据网格,删除项目,更新等。但是,当涉及到插入时我想在单独的窗口中进行,就像在你单击,打开另一个窗口并从那里插入。 但就我所见,两个视图不可能使用相同的ViewWModel。 有什么想法吗?

2 个答案:

答案 0 :(得分:0)

从技术上讲,这是完全可能的,而且很容易做到。 假设你有两个窗口Window1和Window2。

您可以在Window1.xaml.cs中使用此代码:

void BtnOpenNewWindow_Click(object sender, EventArgs e)
{
   var window2= new Window2();
   window2.DataContext = this.DataContext;
   window2.Show();
}

或Window1ViewModel.cs中的此代码

void OpenNewWindowCommand_Execute()
{
   var window2= new Window2();
   window2.DataContext = this;
   window2.Show();
}

但是,这是否是一种好的做法值得怀疑。有更好的方法如何在视图模型之间共享代码或数据。实际上它只与viewmodels无关,它们是一般的OOP原则。

要在viewmodel之间共享代码,可以使用继承:

abstract CommonViewModel
Window1ViewModel extends CommonViewModel
Window2ViewModel extends CommonViewModel

如您所见,它保持视图和视图模型之间的1:1关系。

要在视图模型之间共享数据,您可以从不同的视图模型中引用单个实例

var common = new CommonDataOrLogic(); //this is usually model
var viewmodel1 = Window1ViewModel(common);
var viewmodel2 = Window2ViewModel(common);

你可以使用很多模式: Singleton,ServiceLocator,IoC,EventAggregator等。

答案 1 :(得分:-1)

我希望,

如果将新窗口的所有者设置为MainWindow,则意味着新窗口可以使用MainWindow的视图模型。

例如,

Window newWindow= new Window();
newWindow.Owner = App.Current.MainWindow;