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