2016-07-01 6 views
0

Есть ли способ создать новое окно, которое использует тот же ViewModel, что и MainWindow? Причина в том, что у меня есть сетка данных, в которую я хочу вставлять, удалять элементы, обновлять и т. Д. Но когда дело доходит до вставки, я хочу сделать это в отдельном окне, так как вы нажимаете, открываете другой окно и вставить оттуда. Но, насколько я видел, два вида не могут использовать один и тот же ViewWModel. Любые идеи?MVVM Новое окно, использующее тот же ViewModel

+0

Тот же ViewModel-Type или тот же экземпляр? – lokusking

+2

Модель просмотра - это всего лишь объект - вы просто используете ссылку на объект, поэтому нет причин, почему нет. Это говорит, что вы, вероятно, не хотите этого делать. По крайней мере, посмотрите на модель представления для каждой строки, которая * может * отобразить на вставку вид – Murph

+0

Почему это занижено и проголосовало за закрытие? Это обычный вопрос, связанный с программированием .... – Liero

ответ

-1

Я надеюсь,

Если установить владелец нового окна в MainWindow означает новое окно можно использовать модель представления о MainWindow.

Для примера,

Window newWindow= new Window(); 
newWindow.Owner = App.Current.MainWindow; 
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, вы можете использовать наследование:

abstract CommonViewModel 
Window1ViewModel extends CommonViewModel 
Window2ViewModel extends CommonViewModel 

, как вы можете видеть, он держит 1: 1 отношения между видом и ViewModel.

Для обмена данных между ViewModels, вы можете ссылаться на один экземпляр из различного ViewModels

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

И есть много шаблонов вы можете использовать: Singleton, ServiceLocator, IoC, EventAggregator и т.д ..