我有一个充满动态编辑器的stackpanel。编辑器内的值(TextBoxes,DatePickers等)基于列表框中的项目。我根据绑定到列表框的类及其属性创建这些编辑器。
“渲染”的XAML代码是这样的:
<StackPanel Name="LeftEditorStack">
<StackPanel Name="OuterPanelFirstname">
<RadioButton Name="FirstnameEnabled"></RadioButton>
<!--or any other possible FrameWorkElement-->
<TextBox></TextBox>
</StackPanel>
</StackPanel>
TextBox
有一个绑定在代码后面的数据绑定。
editorBinding = new Binding();
editorBinding.Path = new PropertyPath(String.Format("DataContext.{0}", properties[i].Name));
editorBinding.RelativeSource = new RelativeSource() { Mode = RelativeSourceMode.FindAncestor, AncestorType = typeof(StackPanel), AncestorLevel = 1 };
//editorAttribute is a custom Attribute that contains some information about the type of the Editor, BindingProperty, Position, Size and other stuff
editor.SetBinding(editorAttribute.BindingProperty, editorBinding);
这意味着LeftEditorStack
的Datacontext是绑定TextBox
的真正来源。这工作正常,但是当我更改DataContext
的{{1}}时,LeftEditorStack
没有获得更新。更新发生在TextBox
事件:
SelectionChanged
private void lb_left_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
this.LeftEditorStack.DataContext = null;
this.LeftEditorStack.DataContext = this.lb_left.SelectedItem;
}
更新后,如何让TextBox
更改其值?我无法使用DataContext
中的UpdateTarget
,因为包含我的编辑器的用户控件无法直接访问动态编辑器。
同时设置BindingExpression
或BindingMode
并未改变此行为。
更新
正如Grx70指出我的UpdateSourceTrigger
错了。将AncestorLevel
设置为2后,它可以正常工作。