2010-01-12 5 views
1

가능한 한 간결하게 설명해 드리겠습니다. 나는 두 개의 객체를 가지고 있는데 첫 번째는 Id 속성을 가진 객체 A라고하고 두 번째는 ParentId 속성을 가진 객체 B라고 부를 것이다. 명백한 관계는 개체 B의 ParentId가 개체 A의 Id 속성으로 설정된다는 것입니다. MVVM 패턴을 사용하고 있으므로 viewmodel에 ObservableCollections 객체 2 개가 있습니다. 다른 객체 B가 포함되어 있습니다. viewmodel을 생성 할 때 ObservableCollection 객체를 만들고 채 웁니다. 'A'> ListItems가 있습니다. 당신은 콤보 상자의 SelectedValue가 많은 ListItems에 현재 항목의 ID 속성을 바인딩 볼 수 있듯이 내 XAML은WPF의 이상한 바인딩 동작

<StackPanel> 
    <ListBox IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding ListItems}"> 
    </ListBox> 

    <ComboBox SelectedValuePath="ParentId" SelectedValue="{Binding Path=ListItems/Id, Mode=OneWay}" ItemsSource="{Binding ComboItems}"> 
    </ComboBox> 

    <Button Click="Button_Click" Content="Push Me"/>    
</StackPanel> 

, 간단합니다. 그래서 본질적으로리스트 박스와 콤보 박스는 마스터 세부 사항에 있습니다.

버튼을 누르면 ObservableCollection < 'B'> ComboItems 이름이 채워지고 콤보 상자가 채워집니다. 이제 기이함이 시작됩니다. 프로그램을 시작할 때 버튼을 누른 다음 목록 상자에서 항목을 선택하면 SelectedValue 바인딩으로 인해 콤보 상자가 항목을 올바르게 선택합니다. 그러나 프로그램을 시작한 후 목록 상자에서 항목을 선택한 다음 단추를 누르면 현재 콤보 상자 항목이 현재 목록 상자 항목과 함께 변경되지 않습니다. 바인딩이 영원히 부러진 것처럼 보입니다. 왜 이런 일이 일어나는 지 아는 사람이 있습니까?

ps. SelectedValue/SelectedValuePath를 설정하기 전에 콤보 상자에서 ItemsSource를 설정하면 마스터/세부 바인딩이 작동하지 않습니다. xaml 명령이 있다는 것을 알고 있지만, 그것은 약간 허약 해 보입니다. 그래서 누구도 그걸 입력하면, 나는 모두 귀입니다.

감사, 네이트

편집 -

SelectedValue를 바인딩 할 때, 매우 깨지기입니다. 바인딩이 작동하는 경우, 즉 콤보 박스에서 항목을 선택하면 목록 상자에서 아무 것도 선택하지 않은 채로 콤보 상자를 채운 경우 바인딩이 중단됩니다. 이것으로 많은 시간을 낭비한 후 SelectedItem을 바인딩하기로했습니다. 이 바인딩은 이전에 지정한 조건에서 중단되지 않습니다. 그러나 SelectedValue 바인딩이 어째서 그렇게 우스운 일인지에 대한 답을 얻을 수 있습니다. 대답 해 주신 모든 분들께 다시 한번 감사 드리거나 대답 할 것입니다.

답변

2

네, 우리는 꽤 많이 우연히 발견했습니다.

ItemsSource 속성이 새 값을 얻은 후 SelectedValue 바인딩이 지워지는 것이 문제입니다. 오늘까지 우리는 적절한 해결책을 찾지 못했습니다. 여기

몇 가지 해결 방법은 다음과 같습니다

  • 즉시 새로운 ItemsSource가 설정되어있는 바와 같이, 코드에서 바인딩 SelectedValue를 재설정합니다. 변환기에서이 작업을 수행 할 수 있습니다 (예 : DataContextChanged 이벤트와 같은) ItemsSource 바인딩을 대체 할 위치를 알 수 있습니다.

  • ItemsSourceBinding을 사용하는 대신 CollectionViewSource과 필터를 사용해보십시오. 모든 항목을 CollectionViewSource 개체에 넣고 콤보 상자가 값을 변경하면 항목을 필터링하십시오.

  • 목록 상자에서 SelectionChanged 이벤트가 발생하면 수동으로 이전 방식으로 항목을 가져옵니다.

모든 솔루션이 책에서 가장 좋지 않습니다. 옵션 2, 가장 깨끗한 IMO에 갈 것입니다.)

희망이 있습니다.

+0

답변 해 주셔서 감사합니다. 나는 이것이 xaml에서 바인딩을 연결하는 순서에 어떻게 적용되는지를 보았지만 첫 번째 질문에 해당하는지 확신 할 수 없다. 콤보 상자를 채우기 전에 목록 상자에서 항목을 선택하는 것과 관련이있다. 이 시나리오에서는 ComboBox가 바인딩 된 ObservableCollection이 교체되지 않고 데이터로만 채워지므로 SelectedValue 바인딩이 지워진다는 것을 이해하지 못하거나 생각하지 않습니다. 그래도 내 두 번째 질문에 대답 해 주셔서 감사합니다. 이상한 디자인 인 것 같지만 오웰을 추측합니다. – NastyNateDoggy

+0

참으로 이상하게 보입니다. 아마도 ListItems 컬렉션이 어떻게 든 영향을받을 것입니다. IsSynchronizedWithCurrentItem을 true로 설정하면 컬렉션의 CurrentItem이 초기에 null이 될 SelectedItem과 일치하게됩니다. 아마도 이것은 ListBox에서 선택한 항목을 재설정 할 것입니까? – Arcturus

+0

나는 이것이 내 질문에 완전히 대답하지 않는다고 생각하더라도 답변으로 표시했다. 위의 편집을 읽고 최종 솔루션을 확인하십시오. – NastyNateDoggy