Первая попытка внедрения шаблона MVVM в бизнес-проекте. Я сталкиваюсь с вопросами, на которые, как я полагаю, есть ответы eaiser:
Окно Protype - это базовое представление основных элементов списка элементов. (список объектов Person). Представление содержит Infragistics xamDataGrid для основного списка. Когда элемент выбран в сетке, вы можете редактировать детали на панели подробностей ниже и делать это, когда вы вкладываете поля на панели подробностей, обновления отображаются в реальном времени в данных сетки. Единственное, что я не хочу «presto», я хочу «подождать, пока я нажму кнопку« Применить изменения »».
Я надеялся избежать создания отдельного экземпляра списка, чтобы отделить основной список от рабочего набора элементов, которые я добавляю / удаляю / изменяю на панели сведений.
Путь, по которому я пошел:
Я переопределил стиль CellValuePresenter в поле сетки, чтобы установить привязку «OneWay». Это предотвращает обновление в реальном времени.
<ControlTemplate TargetType="{x:Type igDP:CellValuePresenter}">
<ControlTemplate.Resources>
<Style TargetType="TextBlock">
<Setter Property="Background" Value="{Binding Path=DataItem.NameUIProperty.IsDirty, Converter={StaticResource BooleanBrushConverter}}" />
<Setter Property="IsEnabled" Value="{Binding Path=DataItem.NameUIProperty.IsEditable}" />
</Style>
</ControlTemplate.Resources>
<ContentControl>
<TextBlock Text="{Binding Path=DataItem.Name, Mode=OneTime}" />
</ContentControl>
</ControlTemplate>
Затем я добавляю команду «ApplyUpdates» (RelayCommand) в мой PersonListViewModel. Это вызывает сообщение «PERSON _ITEM_
UPDATED». Я использую порты VB классов MVVM Foundation Messenger и RelayCommand.
#Region "ApplyUpdates Command"
Private mApplyUpdatesCommand As New RelayCommand(AddressOf ApplyUpdates)
Public ReadOnly Property ApplyUpdatesCommand() As ICommand
Get
Return mApplyUpdatesCommand
End Get
End Property
Private Sub ApplyUpdates()
'the changes are already in the object in the list so we don't have to do anything here except fire off the Applied message
Messages.AppMessenger.NotifyColleagues(Messages.PERSON_ITEM_UPDATED)
End Sub
#End Region
PersonView регистрирует сообщение PERSON _ITEM_
UPDATED и перепривязывает сетку при получении сообщения.
'In Loaded Event
'register for window messages we care about
Messages.AppMessenger.Register(Messages.PERSON_ITEM_UPDATED, AddressOf OnPersonItemUpdated)
'EventHandler
Private Sub OnPersonItemUpdated()
PersonGrid.DataSource = Nothing
PersonGrid.DataSource = mViewModel.List
End Sub
Итак, это работает, но пахнет неправильно . Кажется, что в представлении слишком много логики, и ViewModel не определяет состояние пользовательского интерфейса, это представление.
Что мне не хватает? Какой метод вы бы использовали, чтобы заставить ViewModel отложить публикацию изменений в представлении?
Обновление: сейчас я иду по пути создания пользовательской модели представления для сетки (только для чтения, без уведомлений об изменении свойств) и редактируемой модели представления для области сведений. Обе виртуальные машины будут переносить одни и те же бизнес-объекты, но версия ReadOnly не будет публиковать изменения. Это позволит ВМ контролировать, когда обновляется представление.