Сетка данных Silverlight 4 MVVM И дочернее окно Передают данные обратно в родительское окно - PullRequest
3 голосов
/ 30 апреля 2011

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

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

Фрэнсис.

1 Ответ

1 голос
/ 02 мая 2011

Я сделал это в легком наборе инструментов Mvvm, используя обмен сообщениями. Он использует что-то под названием «PubSub», что означает «Опубликовать сообщение, Подписаться на сообщение»

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

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

В зависимости от того, какой набор инструментов MVVM вы используете (если есть), синтаксис может отличаться. В моем случае, как я уже сказал, MVVM легкий. В конечном итоге я использую интерфейс iCommand, чтобы передать эту команду своей модели представления. В моем случае ссылка cmd указывает на Galasoft.MvvmLight.Command:

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;
    }

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

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

Scott

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...