Открытие дочернего окна из модели представления нарушает разделение между представлением и моделью представления, о которых должен быть весь шаблон. Таким образом, вы, вероятно, не имеете большого выбора относительно того, откуда вы открываете дочернее окно - код для страницы, на которой находится сетка. (И это также нарушает шаблон, но, если не считать сложного решения, это все, что вы можете сделать.) Я использую шаблон MVVM, но я не "религиозен" в этом. Я буду нарушать некоторые правила модели, когда это диктует эффективность.
Что касается передачи элемента в ViewModel - я полагаю, вы можете создать свойство в ViewModel, которое представляет идентификатор для элемента. Я использую дочерние окна как формы ввода данных для обновления и добавления. Я склонен создавать ViewModel для каждого из них. В вашем случае у вас будет ViewModel, который представляет детали элемента. Там будет какой-то идентификатор, связанный с предметом и деталями. Это было бы общедоступным свойством на ViewModel. Вы можете создать конструктор для дочернего окна, который принимает этот идентификатор в качестве параметра. Затем конструктор дочернего окна может создать ViewModel и отправить ему идентификатор.
Примерно так - где DomainEdit - это имя дочернего окна.
public DomainEdit()
{
InitializeComponent();
devm = new DomainEditVM();
DataContext = devm;
}
public DomainEdit(Guid domainId) : this()
{
devm.DomainId = domainId;
devm.GetDomain();
txtTitle.Text = "Edit Domain";
}
Затем из кода, за которым происходит нажатие кнопки для сетки, вы создаете дочернее окно с новым конструктором, передавая идентификатор, полученный из привязки элемента в строке сетки, и модель независимого представления для дочернего элемента. окно вступает во владение.
По крайней мере, это то, что работает для меня.