2010-01-13 4 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}"> 

Вот PropertyChangedCallback для недвижимости SelectedTrace в OuterControl, содержащий 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]; 
     } 
    } 
} 

По моей логике должно случиться следующее:

I selec t 3-й объект в ComboBox (SingleChannelList[2]), и происходит обработчик изменений. Затем он переходит в рутину UpdateSelectedTrace(). На данный момент значение SelectedTrace - это, конечно, SingleChannelList[2]. Теперь подпрограмма UpdateSelectedTrace() принудительно устанавливает свойство SelectedTrace в 1-й объект в списке (SingleChannelList[0]), который запускает другой обработчик изменений, вложенный внутри первого. «SelectedTrace» теперь равно SingleChannelList [0], поэтому ComboBox также должен отображать SingleChannelList [0] в качестве его выбора.

все это происходит, когда я следую с отладчиком, пока наглым последним предложением, которое вместо того, выдохлось, как это:

SelectedTrace ныне равен SingleChannelList[0], но ComboBox отображает SingleChannelList[2] в качестве выбранного элемента. Я попробовал UpdatingTarget на BindingExpression и все еще, SelectedTrace Недвижимость хранит значение SingleChannelList[0], а ComboBox продолжает показывать SingleChannelList[2]. Эти привязки безопасны и проверены и всегда работали, пока я не попытался это сделать. Может ли кто-нибудь сказать мне, почему это работает неправильно?

Спасибо

ответ

2

Это звучит как сценарий для свойства зависимостей «значение принуждения». Значение принуждения «толкает» значение свойства к действительному значению на основе желаемого значения. Подробнее об этом здесь:

Dependency Property Callbacks and Validation

+1

Я обнаружил, что, учитывая, что первоначальное изменение происходит из меняющегося поля, это все еще не работает. Вместо этого я просто устанавливал окно после того, как все сделано, и все работает отлично. Хакки, но работает. Реальный вопрос: ПОЧЕМУ не работает мой оригинальный сценарий? – Kamiikoneko

0

Я считаю, что это оптимизация производительности в рамках WPF. Происхождение обновления свойства не получает событие propertychanged (ну, эквивалент привязки), чтобы повторно обновить себя, поскольку это источник изменения. Вы можете принудительно обновить, используя IdentityConverter (ValueConverter, который просто возвращает значение, переданное в) в Binding.

Смежные вопросы