【问题标题】:Change Datacontext of a UserControl更改用户控件的数据上下文
【发布时间】:2016-10-11 14:02:25
【问题描述】:

我必须使用无法更改的 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 的 item 中。

现在有人怎么绑定吗?

谢谢你的帮助,亚历克斯

【问题讨论】:

  • 创建用户控件的方式不正确,因此我们可以提供的任何建议都必须基于用户控件的错误设置,而我们无法在不知情的情况下提供更多关于它,DataContext 应该默认为 parent.DataContext,除非被覆盖
  • Path=Datacontext.SelectedStep:应该是DataContext。是问题还是实际代码中的错字?如果您不在数据模板中使用ParameterControl,绑定是否有效?尝试用smth simple(例如标签)替换它并测试绑定
  • 在 ItemsControl 的 ItemTemplate 中使用的 UserControl 不得显式设置其 DataContext,因为这样做会阻止从项目容器(例如此处的 ListBoxItem)继承 DataContext。
  • @ASh:Datacontext 只是一个错字。

标签: c# wpf user-controls


【解决方案1】:

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

此问题的唯一有效解决方案是从 UserControl 的构造函数中删除 DataContext 分配,并将任何可能的“内部”基于 DataContext 的绑定替换为 RelativeSource 或 ElementName 绑定,例如

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

其中SomeText 是 UserControl 类的属性。

作为一般规则,永远不要明确设置 UserControl 的 DataContext 属性。

【讨论】:

  • 好吧,克莱门斯,我要把它告诉我的同事,因为你是对的。这也是我的看法:)
  • @Alex 不要告诉他们这一点,除非他们努力坚持做错事,但如果他们绝对坚持将 DataContext 设置为this,他们可以给最外层的Grid 一个名字x:Name="contextElement",设置contextElement.DataContext = this;,然后编写很多可怕的代码来解决这个问题。当我对WPF一无所知时,我做了几次。不像他们现在所做的那样相当可怕。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
  • 2016-09-15
  • 2012-12-16
  • 2012-09-30
  • 1970-01-01
相关资源
最近更新 更多