2010-12-06 8 views
0

MVVM WPF 응용 프로그램에서 알람을 관리하는 데 사용되는 마스터 세부 정보보기가 있습니다. AlarmDetails 뷰에는 ComboBox 컨트롤을 통해 설정된 여러 속성이 있습니다. 그 중 하나는 Alarm의 Source이며 다른 View (SourcesView)에서 해당 소스를 변경하여 AlarmDetailsView의 콤보 박스 내용을 변경합니다. 데이터 흐름콤보 상자 항목 소스 바인딩 문제

방법은 비교적 간단

소스는 SourcesView의 컬렉션에 추가
  1. 메시지가 SourcesView로부터 전송되는 각각의 모든 AlarmDetailsViewModel
  2. 소스 컬렉션에 의해 수신
  3. 그에 따라 AlarmDetailsViewModel이 변경되고 ObservableCollection이므로 변경 내용을 각 바인딩 대상에 알립니다.
  4. AlarmDetailsView의 DataContext가 선택된 AlarmDetailsViewModel로 설정되므로 Ite 해당 소스 ComboBox의 msSource 속성이 업데이트되었습니다 (더미 변환기를 사용하여 디버그에서 ItemsSource로 전달되는 업데이트 된 컬렉션을 볼 수 있으며 새로 추가 된 항목이 포함되어 있음)
  5. 이 모든 일이 발생하면 탐색 할 때 AlarmsView/AlarmDetailsView 탭에서 소스 콤보 상자의 항목에는 새 항목이 포함되어 있지 않습니다.
  6. 마스터 목록에서 새 알람을 선택하고 원본을 다시 선택하면 콤보 상자에 새 항목이 잘 표시됩니다 (마스터 목록에서 항목을 선택하면 AlarmDetailsView의 DataContext 속성이 업데이트됩니다).

저는이 문제를 놓치고 있습니다. 저는 잠시 동안이 문제를 푸념했습니다.

누구나 아이디어가 있으십니까? 모든 디버깅 제안 사항?

감사합니다,

알렉스

편집 : 알람 개체의 속성 (즉, 소스 등)를 설정하는 데 사용되는 것을 의미의 AlarmDetailsView 내 위치 업데이트하지 않습니다 콤보. 희망이 도움이됩니다.

EDIT 2 : 다른 해결책은 목록 대신 ObservableCollection을 사용하는 것이 었습니다. 어떤 이유로, 위에서 설명한대로 List에서 PropertyChange 이벤트를 발생 시키면 ComboBox가 해당 ItemsSource를 새로 고치지 만 해당 드롭 다운에 새 항목을 추가하지는 않습니다. ObservableCollection을 사용하면 propertychange 이벤트를 자체적으로 관리하므로 이벤트를 발생시킬 필요가 없습니다.

답변

0

** 수정 **

미운 솔루션

하지만 누군가가 더 나은 솔루션이있는 경우, :)

컬렉션을 비운 공유하시기 바랍니다 나를 위해 일한 GUI를 통보 gui에게 통지 된 실제 콜렉션을 추가했습니다.

+0

작동하지 않습니다. 귀찮게하는 것은 바인딩에 추가 한 변환기를 통해 업데이트되는 실제 ComboBox 컬렉션을 볼 수 있다는 것입니다. 컬렉션이 변경되면 Converter가 호출되고 통과하는 객체 (ItemsSource 컬렉션)에는 새 항목이 포함됩니다. 그러나 마스터 목록에서 선택한 알람을 변경하기 전까지는 드롭 다운에 표시되지 않습니다. – alex

+0

음, 그 문제도있었습니다. 그것을 해결하기 위해 해킹했다 .... 컬렉션을 비우고, GUI를 통보, gui에게 통보 된 실제 컬렉션을 추가 ... 지옥으로 추악한하지만 나를 위해 일했습니다 – debe

+0

그러나 그것은 못생긴 즉, 작동합니다. 주석 대신 답으로 게시하면 답변으로 표시됩니다. (누군가가 진정한 해결책을 제시하지 않는다면 우리 모두에게 도움이 될 것입니다! :-)) – alex

0

MasterView/Detail 바인딩을 처리하려면 CollectionViewSource를 사용해보십시오.Heres는 예를 들어

<Window.Resources> 
    <CollectionViewSource x:Key="data" Source="{Binding}" /> 
<Window.Resources> 

DataContext="{Binding CurrentItem, Source={StaticResource data}}" 
+0

ComboBox의 ItemsSource 속성을 ViewModel의 O에 직접 바인딩하는 대신 CollectionViewSource에 바인딩하는 것을 의미합니까? bservableCollection 또는 MasterView 항목 컬렉션의 CurrentItem에 DetailsView의 DataContext를 바인딩한다는 의미입니다 (두 번째 선택 항목처럼 보입니다)? 나는 성공 (DataContext 옵션) 그것을 시도했다. – alex

+0

CollectionViewSource를 ViewModel의 마스터 컬렉션에 바인딩합니다. 마스터 ItemsControl (ComboBox)을 CollectionViewSource에 바인딩하십시오. 세부 정보 컨트롤을 CollectionViewSource의 CurrentItem 속성에 바인딩하십시오. 또한 ItemsControl에 IsSynchronizedWithCurrentItem = "True"가 있는지 확인하십시오. –

+0

Ok. 제 설명이 완전히 명확하지 않을 수도 있습니다. 결함이있는 ComboBox는 DetailsView 내에 있으며 세부 정보 속성 중 하나를 설정합니다. 표시 할 DetailsView를 선택하는 ComboBox는 아닙니다. – alex