C#WPF Datacontext绑定动态元素
我有一个充满动态编辑器的stackpanel。编辑器(文本框、日期选择器等)中的值基于列表框中的项目。我根据类及其绑定到listbox的属性创建这些编辑器 “呈现的”XAML代码如下所示:C#WPF Datacontext绑定动态元素,c#,wpf,dynamic,data-binding,datacontext,C#,Wpf,Dynamic,Data Binding,Datacontext,我有一个充满动态编辑器的stackpanel。编辑器(文本框、日期选择器等)中的值基于列表框中的项目。我根据类及其绑定到listbox的属性创建这些编辑器 “呈现的”XAML代码如下所示: <StackPanel Name="LeftEditorStack"> <StackPanel Name="OuterPanelFirstname"> <RadioButton Name="FirstnameEnabled"></RadioBu
<StackPanel Name="LeftEditorStack">
<StackPanel Name="OuterPanelFirstname">
<RadioButton Name="FirstnameEnabled"></RadioButton>
<!--or any other possible FrameWorkElement-->
<TextBox></TextBox>
</StackPanel>
</StackPanel>
这意味着LeftEditorStack
的数据上下文是文本框
绑定的真正来源。这很好,但是当我更改LeftEditorStack
的DataContext
时,TextBox
不会得到更新。更新发生在SelectionChanged
事件中:
private void lb_left_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
this.LeftEditorStack.DataContext = null;
this.LeftEditorStack.DataContext = this.lb_left.SelectedItem;
}
更新DataContext
时,如何使TextBox
更改其值?我无法从BindingExpression
使用UpdateTarget
,因为包含我的编辑器的usercontrol无法直接访问动态编辑器。
设置绑定模式
或更新资源记录器
也不会改变此行为
更新
正如Grx70指出的那样,我的
anstorlevel
是错误的。在我将AncestorLevel
设置为2之后,它工作正常。实际上,由于您在绑定上设置了AncestorLevel=1
,因此OuterPanelFirstname
的数据上下文是绑定的源,这是从LeftEditorStack
继承的,除非它被明确设置-你确定永远不会是这样吗?这是一个问题,我将尝试将其更改为AncestorLevel=2
,所有编辑器的基本结构都是相同的。谢谢,AncestorLevel=2
解决了我的问题,由于您在绑定上设置了AncestorLevel=1
,因此OuterPanelFirstname
的数据上下文是绑定的源,它继承自LeftEditorStack
,除非它是显式设置的-您确定永远不会这样吗?这是一个要点,我将尝试将其更改为AncestorLevel=2
,所有编辑器的基本结构都是一样的。谢谢,AncestorLevel=2
解决了我的问题
private void lb_left_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
this.LeftEditorStack.DataContext = null;
this.LeftEditorStack.DataContext = this.lb_left.SelectedItem;
}