#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), форма данных обновляется соответствующим образом.
Если вам нужна дополнительная информация, дайте мне знать!
Скотт