Есть ли способ создать новое окно, которое использует тот же ViewModel, что и MainWindow? Причина в том, что у меня есть сетка данных, в которую я хочу вставлять, удалять элементы, обновлять и т. Д. Но когда дело доходит до вставки, я хочу сделать это в отдельном окне, так как вы нажимаете, открываете другой окно и вставить оттуда. Но, насколько я видел, два вида не могут использовать один и тот же ViewWModel. Любые идеи?MVVM Новое окно, использующее тот же ViewModel
ответ
Я надеюсь,
Если установить владелец нового окна в 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, вы можете использовать наследование:
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 и т.д ..
Тот же ViewModel-Type или тот же экземпляр? – lokusking
Модель просмотра - это всего лишь объект - вы просто используете ссылку на объект, поэтому нет причин, почему нет. Это говорит, что вы, вероятно, не хотите этого делать. По крайней мере, посмотрите на модель представления для каждой строки, которая * может * отобразить на вставку вид – Murph
Почему это занижено и проголосовало за закрытие? Это обычный вопрос, связанный с программированием .... – Liero