将UserControl绑定到ListView datatemplate WPF中

时间:2014-03-23 18:48:58

标签: wpf xaml binding dependency-properties

所以我有这个问题:

  • 我创建了一个UserControl(基本上是一个文本框和标签)。这个用户控件我可以使用依赖属性绑定。
  • 我有一个ListView,我可以在其中将一个文本框放在datatemplate中并绑定" text"属性为绑定值。
到目前为止一切顺利。但现在,如果我尝试将UserControl置于同一场景中,DependencyProperty将停止工作。

以下是代码: [ListView]

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

这种情况下的绑定在listview之外,在表单的其他部分中有效...所以它不是我的DepedencyProperty的问题。也可以用UserControl替换文本框,并添加完全相同的Binding也可以。但它根本不起作用......为什么?!

UPDATE 根据要求,我更新了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

1 个答案:

答案 0 :(得分:4)

就像我在评论问题中提到的那样,你已经在UserControl中明确地将userControl DataContext设置为自己:

Me.DataContext = Me

因此,绑定label="{Binding detail}" 在UserControl(本身)的dataContext中查找属性detail,而不是在ListBoxItem的基础dataContext中

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

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

您应该在UserControl中删除设置DataContext

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

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