Wpf MVVM使用相同ViewModel的新窗口

Wpf MVVM使用相同ViewModel的新窗口,wpf,mvvm,multiple-views,Wpf,Mvvm,Multiple Views,有没有办法创建一个与主窗口使用相同ViewModel的新窗口? 这样做的原因是我有一个数据网格,我想插入,删除项目,更新等。但是,当涉及到插入时,我想在一个单独的窗口中进行插入,就像在您单击,打开另一个窗口并从那里插入一样。 但就我所见,两个视图不可能使用同一个ViewWModel。 有什么想法吗?我希望 如果将新窗口的所有者设置为MainWindow,则表示新窗口可以使用MainWindow的视图模型 比如说, Window newWindow= new Window(); newWindow

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

我希望

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

比如说,

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

从技术上讲,这是完全可能的,而且很容易做到。 假设您有两个窗口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之间共享代码或数据。实际上,它不仅仅与viewmodels相关,它们是通用的OOP原则

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

abstract CommonViewModel
Window1ViewModel extends CommonViewModel
Window2ViewModel extends CommonViewModel
如您所见,它保持了视图和viewmodel之间的1:1关系

要在viewmodels之间共享数据,可以引用来自不同viewmodels的单个实例

var common = new CommonDataOrLogic(); //this is usually model
var viewmodel1 = Window1ViewModel(common);
var viewmodel2 = Window2ViewModel(common);
您可以使用很多模式:
Singleton、ServiceLocator、IoC、EventAggregator等..

相同的ViewModel类型或相同的实例?视图模型只是一个对象-您只是使用对该对象的引用,因此没有理由不使用。也就是说你可能不想这么做。至少每行查看一个视图模型,该模型可能映射到插入视图。为什么会对其进行向下投票并投票关闭?这是一个与编程相关的常规问题……如果您使用的是MVVM,我想您已经将数据层分离了。因此,您想要共享的可能不是ViewModel,而是模型。您能展示一下当前如何创建新窗口吗?但据我所知,两个视图不可能使用同一个ViewWModel。你试过什么?为什么不可能呢?