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