가능한 한 간결하게 설명해 드리겠습니다. 나는 두 개의 객체를 가지고 있는데 첫 번째는 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 바인딩이 어째서 그렇게 우스운 일인지에 대한 답을 얻을 수 있습니다. 대답 해 주신 모든 분들께 다시 한번 감사 드리거나 대답 할 것입니다.
답변 해 주셔서 감사합니다. 나는 이것이 xaml에서 바인딩을 연결하는 순서에 어떻게 적용되는지를 보았지만 첫 번째 질문에 해당하는지 확신 할 수 없다. 콤보 상자를 채우기 전에 목록 상자에서 항목을 선택하는 것과 관련이있다. 이 시나리오에서는 ComboBox가 바인딩 된 ObservableCollection이 교체되지 않고 데이터로만 채워지므로 SelectedValue 바인딩이 지워진다는 것을 이해하지 못하거나 생각하지 않습니다. 그래도 내 두 번째 질문에 대답 해 주셔서 감사합니다. 이상한 디자인 인 것 같지만 오웰을 추측합니다. – NastyNateDoggy
참으로 이상하게 보입니다. 아마도 ListItems 컬렉션이 어떻게 든 영향을받을 것입니다. IsSynchronizedWithCurrentItem을 true로 설정하면 컬렉션의 CurrentItem이 초기에 null이 될 SelectedItem과 일치하게됩니다. 아마도 이것은 ListBox에서 선택한 항목을 재설정 할 것입니까? – Arcturus
나는 이것이 내 질문에 완전히 대답하지 않는다고 생각하더라도 답변으로 표시했다. 위의 편집을 읽고 최종 솔루션을 확인하십시오. – NastyNateDoggy