2010-01-13 17 views
5

Mam kontroli z ComboBox:Zmiana wartości DependencyProperty wewnątrz PropertyChangedCallback dla tego DependencyProperty

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

oto PropertyChangedCallback dla właściwości SelectedTrace w OuterControl zawierający ComboBox:

private static void OnSelectedTraceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    OuterControl oc = d as OuterControl ; 
    oc.UpdateSelectedTrace(); 
} 

private void UpdateSelectedTrace() 
{ 
    ViewModelType vm = DataContext as ViewModelType; 
    if (vm != null) 
    { 
     if (vm.SingleChannelList != null) 
     { 
      SelectedTrace = vm.SingleChannelList[0]; 
     } 
    } 
} 

Według mojej logiki, powinny nastąpić następujące zdarzenia:

I selec t trzeci obiekt w obiekcie ComboBox (SingleChannelList[2]) i pojawia się procedura zmiany. Następnie przechodzi do rutyny UpdateSelectedTrace(). W tym momencie wartość SelectedTrace jest oczywiście SingleChannelList[2]. Teraz, procedura UpdateSelectedTrace() przymusowo ustawia właściwość SelectedTrace na pierwszy obiekt na liście (SingleChannelList[0]), który uruchamia inną procedurę zmiany zagnieżdżoną wewnątrz pierwszego. "SelectedTrace" teraz równa się SingleChannelList [0], więc ComboBox powinien również pokazywać SingleChannelList [0] jako swój wybór.

Wszystko to dzieje się, gdy śledzę z debuggera aż do wytłuszczoną ostatnim zdaniu, w którym zamiast tego gra się tak:

SelectedTrace teraz równa SingleChannelList[0], ale ComboBox wyświetlacze SingleChannelList[2] jako wybranego elementu. Próbowałem UpdatingTarget na BindingExpression i nadal, SelectedTrace Właściwość posiada wartość SingleChannelList[0], podczas gdy ComboBox nadal wyświetla SingleChannelList[2]. Te wiązania są bezpieczne i sprawdzone i zawsze działały, dopóki nie spróbowałem tego zrobić. Czy ktoś może mi powiedzieć, dlaczego to nie działa poprawnie?

Dziękuję

Odpowiedz

2

To brzmi jak scenariusz dla właściwość zależność „wartość przymusu”. Wartość przymusowa "popycha" wartość własności do prawidłowej wartości na podstawie pożądanej wartości. Czytaj więcej na ten temat tutaj:

Dependency Property Callbacks and Validation

+1

Zauważyłem, że biorąc pod uwagę, że oryginalna zmiana pochodzi z pola, które się zmienia, to nadal nie działa. Zamiast tego po prostu mocno ustawiam pudełko po tym, jak wszystko jest gotowe i działa dobrze. Hacky, ale działa. Prawdziwe pytanie brzmi: DLACZEGO nie działa mój pierwotny scenariusz? – Kamiikoneko

0

Wierzę, że to jest optymalizacja wydajności przez ramy WPF. Źródło aktualizacji właściwości nie otrzymuje zdarzającego się zdarzenia (no, równoważnego powiązania), aby ponownie zaktualizować się, ponieważ jest źródłem zmiany. Możesz wymusić aktualizację za pomocą IdentityConverter (ValueConverter, który właśnie zwraca wartość przekazaną) w Powiązanie.

Powiązane problemy