我有一个ComboBox
的控件:
<ComboBox x:Name="TraceComboBox"
ItemsSource="{Binding SingleChannelList}"
SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type cc:LogicTriggerSimpleLevelControl}},
Path=SelectedTrace, Mode=TwoWay}">
以下是包含PropertyChangedCallback
的OuterControl中属性SelectedTrace
的{{1}}:
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
)中的第3个对象,然后发生更改处理程序。然后它进入SingleChannelList[2]
例程。此时,UpdateSelectedTrace()
的值当然是SelectedTrace
。现在,SingleChannelList[2]
例程强制将UpdateSelectedTrace()
属性设置为列表中的第一个对象(SelectedTrace
),这会触发嵌套在第一个对象中的另一个更改处理程序。 “SelectedTrace”现在等于SingleChannelList [0],因此ComboBox也应该显示SingleChannelList [0]作为其选择。
所有这一切都发生在我跟随调试器,直到粗体的最后一句话,而不是像这样:
SingleChannelList[0]
现在等于SelectedTrace
,但SingleChannelList[0]
显示ComboBox
作为其所选项目。我在SingleChannelList[2]
上尝试UpdatingTarget
,BindingExpression
属性保留值SelectedTrace
,而SingleChannelList[0]
继续显示ComboBox
。这些绑定是安全的并经过测试,并且一直有效,直到我尝试这样做。谁能告诉我为什么这不能正常工作?
谢谢
答案 0 :(得分:2)
这听起来像是依赖属性'价值强制'的场景。值强制将属性的值“推送”为基于期望值的有效值。在这里阅读更多相关信息:
答案 1 :(得分:0)
我相信这是WPF框架的性能优化。属性更新的起源不会获得propertychanged事件(以及绑定等效事件)来重新更新自身,因为它是更改的起源。您可以使用在绑定中使用IdentityConverter(只返回传入值的ValueConverter)强制更新。