Silverlight 4 MVVM DataGrid И дочернее окно передают данные обратно в родительское окно

#silverlight #mvvm #datagrid

#silverlight #mvvm #datagrid

Вопрос:

Мне нужна некоторая помощь. У меня есть приложение Silverlight, в родительской форме есть кнопка поиска, которая при нажатии загружает модальный каталог, содержащий 3 текстовых поля, две кнопки (для поиска и сброса настроек) и сетку данных (telerik gridview, но я могу изменить ее на любую сетку, так что это не проблема). Я ввожу критерии поиска на одной из кнопок, произношу фамилию, и все записи с этой конкретной фамилией загружаются в сетку. Мне нужно иметь возможность выбрать строку в сетке, и после этого сведения о выбранной строке должны быть обновлены в элементах управления в родительском окне (в родительском окне сетки нет, это похоже на форму ввода данных). Я использую MVVM. Как мне достичь этого, сохраняя верность шаблону MVVM? Я только что видел много материала о передаче данных от родителя к дочернему, нет в дочернем окне родительскому / вызывающему.

Любая помощь и несколько простых примеров кода будут высоко оценены. Работаю над этим целых 3 дня и пока не разобрался.

Фрэнсис.

Ответ №1:

Я сделал это в Mvvm light toolkit с помощью обмена сообщениями. Он использует нечто, называемое «PubSub», что означает «Опубликовать сообщение, подписаться на сообщение»

Я использую команду в GridView моего модального окна. Вот XAML для этого:

 <i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
        <cmd:EventToCommand Command={Binding ItemSelectedCommand} />
    </i:EventTrigger>
</i:Interaction.Triggers>
  

В зависимости от того, какую версию (если таковая имеется) инструментария MVVM toolkit вы используете, синтаксис может отличаться. В моем случае, как я уже сказал, MVVM light. В конечном итоге я использую интерфейс ICommand для передачи этой команды в мою модель представления. В моем случае ссылка cmd указывает на Galasoft.MVVMLight.Команда:

 xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;Assembly=GalaSoft.MvvmLight.Extras.SL4"
  

В ViewModel для моего дочернего окна я регистрируюсь для команды, и когда она запускается, я вызываю эту строку:

 Messenger.Default.Send<TSMVVM.Model.WorkOrders>(SelectedWorkOrder);
  

Эта строка публикует (отправляет) сообщение типа WorkOrders (которое является классом модели в моем приложении), проходящее через SelectedWorkOrder. Эта строка кода находится внутри команды, которая запускается при событии SelectionChanged моего gridview. Пример кода для этого:

 _ItemSelectedCommand = new RelayCommand(WorkOrderSelected);

private void WorkOrderSelected() 
{
    Messenger.Default.Send<TSMVVM.Model.WorkOrders>(SelectedWorkOrder);
}
  

В моем родительском окне, в конструкторе, у меня есть это:

 Messenger.Default.Register<TSMVVM.Model.WorkOrders>(this, SetWorkOrder);
  

Эта строка регистрируется (или подписывается) на сообщение типа WorkOrders. Каждый раз, когда через мое приложение отправляется сообщение типа WorkOrder, оно вызывает функцию SetWorkOrder, которая приведена ниже:

 private void SetWorkOrder(TSMVVM.Model.WorkOrders wo) 
    {
        this.SelectedWO = wo;
    }
  

Моя форма данных имеет ItemsSource, привязанный к WorkOrders, и CurrentItem, привязанный к SelectedWO, установленный с привязкой TwoWay. Поэтому, когда я обновляю выбранные два (реализуя INotifyPropertyChanged через viewmodelbase от Mvvm light toolkit), форма данных обновляется соответствующим образом.

Если вам нужна дополнительная информация, дайте мне знать!

Скотт