2016-07-01 54 views
0

有什么方法可以使用与MainWindow使用相同ViewModel的新窗口? 原因是我有一个数据网格,我想要插入,删除项目,更新等等。但是,当涉及到插入我想在一个单独的窗口中,如在你点击,打开另一个窗口并从那里插入。 但据我所见,两个视图不可能使用相同的ViewWModel。 任何想法?MVVM使用相同ViewModel的新窗口

+0

相同的ViewModel类型或相同的实例? – lokusking

+2

视图模型只是一个对象 - 您只是使用对象的引用,所以没有理由不这样做。这就是说你可能不想这样做。至少要查看每行可能映射到插入视图的视图模型 – Murph

+0

为什么这是downvoted并投票结束?这是一个有关编程的常见问题.... – Liero

回答

-1

我希望,

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

例如,

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

在技术上是完全可能的,这是很容易做到的。 可以说你有两个窗口Window1和Window2。在Window1ViewModel.cs

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

或验证码

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

然而,这是值得怀疑它是否是一个好习惯:

,你可以有这样的代码在Window1.xaml.cs。如何在视图模型之间共享代码或数据有更好的方法。实际上它只与视图模型无关,它们是一般的面向对象原则。

要共享的ViewModels之间的代码,你可以使用继承:

abstract CommonViewModel 
Window1ViewModel extends CommonViewModel 
Window2ViewModel extends CommonViewModel 

,你可以看到,它保持1:视图和视图模型之间一对一的关系。

要共享的ViewModels之间的数据,你可以从不同的ViewModels

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

参考实例,并有很多的方式,你可以使用: 辛格尔顿,服务定位,国际奥委会,EventAggregator等。

相关问题