更改UserControl的数据上下文

本文关键字:上下文 数据 UserControl 更改 | 更新日期: 2023-09-27 18:12:26

我必须使用UserControl,我不能改变。这个UserControl的Datacontext在它的构造函数中被设置为它自己。

public ParameterControl()
{
    Datacontext = this;
}

UserControl应该是ListBox-Items的模板。

<ListBox>
   <ListBox.ItemTemplate>
      <DataTemplate>
         <parameterControl:ParameterControl
            DataContext="{Binding ElementName=StepView, Path=Datacontext.SelectedStep}" //this doesn't work
         </parameterControl:ParameterControl>
      </DataTemplate>
   </ListBox.ItemTemplate>
</ListBox>

我为数据上下文实现的绑定不起作用。

有谁知道我如何解决这个问题或告诉我在什么时间设置数据上下文吗?

谢谢你的帮助,亚历克斯

编辑:

你好,

没有机会重建ParameterControl。我有这个想法…

<ListBox
   ItemsSource="{Binding Parameters}"
   <ListBox.ItemTemplate>
      <DataTemplate>
         <parameterControl:ParameterControl
            ParamName="{Binding <!--To the item in the ItemsSource-Collection-->}"
         </parameterControl:ParameterControl>
      </DataTemplate>
   </ListBox.ItemTemplate>
</ListBox>

参数Control只需要正确显示ParamName属性的名称。此名称位于ItemsSource-Collection的项中。

有人知道怎么绑定吗?

谢谢Alex的帮助

更改UserControl的数据上下文

在ItemsControl的ItemTemplate中使用的UserControl不能显式地设置其DataContext属性,因为这样做会阻止从项目容器继承DataContext(例如这里的ListBoxItem)。

这个问题的唯一有效解决方案是从UserControl的构造函数中删除DataContext赋值,并用RelativeSourceElementName绑定替换任何可能的"内部"基于DataContext的绑定,如

<TextBlock
    Text="{Binding SomeText, RelativeSource={RelativeSource AncestorType=UserControl}}"/>

其中SomeText是UserControl类的属性。

作为一般规则,永远不要显式地设置UserControl的DataContext属性