LOB 프로젝트에서 MVVM 패턴을 구현하는 첫 번째 시도. 나는이 질문에 답을 달고있다.WPF MasterDetail ViewModel 마스터 목록의 업데이트가 지연됩니다. (그리드가 자동으로 업데이트되지 않도록)
Protype 창은 항목 목록의 기본적인 마스터 - 세부보기이다. (Person 객체 목록). 이 뷰에는 마스터 목록에 대한 Infragistics xamDataGrid가 포함되어 있습니다. 그리드에서 항목을 선택하면 아래의 세부 정보 패널에서 세부 정보를 편집하고 세부 사항 패널의 필드를 탭하면 해당 정보가 그리드 데이터에 "실시간"으로 표시됩니다. 단, 나는 "Presto"를 원하지 않는다. 나는 'Apply Changes'버튼을 누를 때까지 기다려야한다. "
세부 정보 패널에서 추가/삭제/수정중인 작업 항목 집합에서 마스터 목록을 분리하는 목록의 별도 인스턴스를 만드는 것을 피하기를 바랬습니다.
내가 내려 갔다 경로
는 :나는 내가 "한방향"에 바인딩을 설정할 수 있습니다 그리드 분야에서 CellValuePresenter 스타일을 오버라이드. 이렇게하면 실시간 업데이트가 수행되지 않습니다.
<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'메시지가 표시됩니다. MVVM Foundation Messenger 및 RelayCommand 클래스의 VB 포트를 사용하고 있습니다.
#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
그래도 작동하지만, smells wrong입니다. 보기에는 너무 많은 논리가있는 것으로 보이며 ViewModel은 UI의 상태를 지시하지 않습니다.보기가 있습니다.
무엇이 누락 되었습니까? ViewModel에서 변경 사항을 뷰에 게시하는 것을 지연 시키려면 어떤 방법을 사용 하시겠습니까?
업데이트 : 이제 세부 구역에 대해 그리드에 대한 사용자 지정 ViewModel (읽기 전용, Propertychanged 알림 없음) 및 편집 가능한 ViewModel을 만드는 과정을 거칩니다. 두 VM은 동일한 비즈니스 개체를 래핑하지만 ReadOnly 버전은 변경 사항을 게시하지 않습니다. 이렇게하면 뷰가 업데이트되는 시점을 VM이 제어하게됩니다.
Infragistics 팁 주셔서 감사합니다. 언젠가는 그렇게 될 것입니다! – TheZenker