Изменение значения DependencyProperty внутри PropertyChangedCallback для этого DependencyProperty - PullRequest
5 голосов
/ 13 января 2010

У меня есть элемент управления с ComboBox:

<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];
        }
    }
}

По моей логике должно произойти следующее:

Я выбираю третий объект в 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 ]

2 голосов
/ 13 января 2010

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

Обратные вызовы и проверка свойств зависимостей

0 голосов
/ 23 февраля 2013

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

...