2010-01-13 1 views
5

나는 ComboBox와 함께 컨트롤을 가지고 :해당 DependencyProperty에 대한 PropertyChangedCallback 내에서 DependencyProperty의 값 변경

<ComboBox x:Name="TraceComboBox" 
      ItemsSource="{Binding SingleChannelList}" 
      SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor, 
         AncestorType={x:Type cc:LogicTriggerSimpleLevelControl}}, 
         Path=SelectedTrace, Mode=TwoWay}"> 

다음은 ComboBox를 포함하는 OuterControl의 SelectedTrace 속성입니다.

내 논리에 의하면 다음과 같은 결과가 발생합니다.

ComboBox (SingleChannelList[2])에서 세 번째 객체를 선택하면 변경 핸들러가 발생합니다. 그런 다음 UpdateSelectedTrace() 루틴으로 들어갑니다. 이 시점에서 SelectedTrace의 값은 물론 SingleChannelList[2]입니다. 이제 UpdateSelectedTrace() 루틴은 SelectedTrace 속성을 목록의 첫 번째 객체 (SingleChannelList[0])에 강제로 설정합니다.이 객체는 첫 번째 객체 안에 중첩 된 다른 변경 핸들러를 시작합니다. "SelectedTrace"는 이제 SingleChannelList [0]와 동일하므로 ComboBox는 SingleChannelList [0]도 선택 항목으로 표시해야합니다.

이 모든 것은 다음과 같이 대담하게 직면하는 마지막 문장까지 디버거를 따라갈 때 발생합니다.

SelectedTrace는 이제 SingleChannelList[0]와 같지만 ComboBox은 선택한 항목으로 SingleChannelList[2]을 표시합니다. 나는 BindingExpression에서 UpdatingTarget을 시도했지만 여전히 SelectedTrace 속성은 ComboBoxSingleChannelList[2]을 계속 표시하는 동안 SingleChannelList[0] 값을 보유합니다. 이러한 바인딩은 안전하고 테스트되었으며 항상이 작업을 시도 할 때까지 계속 작동했습니다. 아무도 이것이 왜 제대로 작동하지 않는지 말해 줄 수 있습니까?

고맙습니다.

답변

2

이것은 'value coercion'종속성 속성에 대한 시나리오와 같습니다. 가치 강제는 원하는 가치에 근거하여 재산 가치를 유효한 가치로 '밀어 넣는다'. 여기에 대해 자세히 알아보기 :

Dependency Property Callbacks and Validation

+1

원래 변경 사항이 변경되는 상자에서 비롯된 것이라면 여전히 작동하지 않습니다. 대신 모든 일이 끝난 후 상자를 열면 제대로 작동합니다. 해키지만 작동합니다. 진짜 질문은 원래 시나리오가 작동하지 않는 이유는 무엇입니까? – Kamiikoneko

0

나는 이것이 WPF 프레임 워크에 의한 성능 최적화 믿습니다. 속성 업데이트의 출처는 변경의 원점이기 때문에 자체를 다시 업데이트하기 위해 propertychanged 이벤트 (해당되는 바인딩 동일)를 얻지 못합니다. Binding에서 IdentityConverter (전달 된 값만 반환하는 ValueConverter)를 사용하여 업데이트를 수행 할 수 있습니다.