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