在WPF中,如何在ListView的数据模板中绑定用户控件?

3

我有一个问题:

  • 我创建了一个用户控件(基本上是文本框和标签)。我能够使用依赖属性进行绑定。
  • 我有一个 ListView,在其中可以在 datatemplate 中放置文本框并将 "text" 属性绑定到绑定的值。

到目前为止还不错。但是,如果我尝试将用户控件放到同样的情境中,依赖属性就停止工作了。

这是代码:[ListView]

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

在这种情况下,当它在listview之外的其他部分中使用时,绑定是有效的...所以这不是我的DepedencyProperty的问题。同时,用一个Textbox替换UserControl,并添加完全相同的绑定也可以工作。但是在这种情况下却不能工作,为什么?!
更新 按照请求,我已经更新了UserControl的代码。请记住,在将其绑定到窗口或页面上的其他元素时,它可以完美地工作。只是在listview中不起作用。
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

1
你的UserControl的代码。这里的代码看起来没问题。 - Rohit Vats
1
UserControl:tbx 是什么?也许是 tbx:UserControl - Hamlet Hakobyan
1
UserControl 是我的项目名称,其中包含用户控件,而 tbx 则是该用户控件的名称。 - CogentP
1个回答

4

正如我在评论中提到的那样,问题出在您的UserControl中,您明确将userControl的DataContext设置为它自己:

Me.DataContext = Me

因此,绑定 label="{Binding detail}" 在 UserControl 的数据上下文中查找属性 detail,并不是在 ListBoxItem 的基础数据上下文中查找。

如果您想要在 ListBoxItem 的数据上下文中查找项,则必须进行显式绑定,例如:

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

或者

在UserControl中,您应该删除将DataContext设置为自身的设置。

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

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

太棒了。去掉DataContext确实奏效了。我会遵循你的第二个建议,看看是否能完全解决我的问题! - CogentP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接