【问题标题】:Binding UserControl inside a ListView datatemplate WPF在 ListView 数据模板 WPF 中绑定 UserControl
【发布时间】:2014-04-30 23:34:47
【问题描述】:

所以我有这个问题:

  • 我创建了一个 UserControl(基本上是一个文本框和标签)。我可以使用依赖属性绑定此用户控件。
  • 我有一个 ListView,我可以在其中将文本框放入数据模板并将“文本”属性绑定到绑定值。

到目前为止一切顺利。但现在,如果我尝试将 UserControl 置于相同的场景中,DependencyProperty 将停止工作。

代码如下:[ListView]

<ListView x:Name="DtContactDetailListView" ItemsSource="{Binding}">
   <ListBox.ItemTemplate>
      <DataTemplate>
         <UserControl:tbx label="{Binding detail}" text="{Binding value}"/>
      </DataTemplate>
   </ListBox.ItemTemplate>
</ListView>

这种情况下的绑定在列表视图之外,在表单的其他部分时起作用......所以它不是我的 DepedencyProperty 的问题。也可以用 UserControl 代替 Textbox,并添加完全相同的 Binding 也可以。但它在这个下不起作用......为什么?!

更新 根据要求,我更新了 UserControl 的代码。请记住,当将其绑定到窗口或页面上的其他元素时,这非常有效。只是在列表视图中不起作用。

Public Sub New()
    InitializeComponent()
    Me.DataContext = Me
End Sub

'TextBox property
Public Shared ReadOnly tbxTextProperty As DependencyProperty = DependencyProperty.Register("text", GetType([String]), GetType(tbx), New FrameworkPropertyMetadata(String.Empty))
Public Property text() As [String]
    Get
        Return GetValue(tbxTextProperty).ToString()
    End Get
    Set(value As [String])
        SetValue(tbxTextProperty, value)
    End Set
End Property

【问题讨论】:

  • 您的 UserControl 的邮政编码。这里的代码看起来不错。
  • 什么是UserControl:tbx?也许tbx:UserControl
  • UserControl 是我保存用户控件的项目的名称,tbx 是用户控件本身的名称。

标签: wpf xaml binding dependency-properties


【解决方案1】:

就像我在评论问题中提到的在您的 UserControl 中,您已将 userControl 的 DataContext 明确设置为自身:

Me.DataContext = Me

所以,绑定label="{Binding detail}" 在UserControl(本身)的dataContext中而不是在ListBoxItem的底层dataContext中寻找属性detail

如果要在 ListBoxItem 的 DataContext 中查找项目,则必须进行显式绑定,例如:

label="{Binding DataContext.detail,
                RelativeSource={RelativeSource Mode=FindAncestor, 
                                            AncestorType=ListBoxItem}}"

您应该在 UserControl 中将 DataContext 设置为自身。

您必须将其设置为与声明的 DP 绑定。我建议使用ElementName 绑定它并删除设置DataContext。这样您就不必进行显式绑定,并且您的UserControl 将自动从其Visual 父级继承DataContext。

<UserControl x:Name="myUserControl">
   <Label Content="{Binding label, ElementName=myUserControl}"/>
   <TextBlock Text="{Binding text, ElementName=myUserControl}"/>
</UserControl>

【讨论】:

  • 太棒了。所以删除 DataContext 就可以了。我会听从你的第二个建议,看看它是否能一起解决我的问题!
猜你喜欢
  • 1970-01-01
  • 2011-04-30
  • 2021-12-25
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 2012-01-22
相关资源
最近更新 更多