所以我有这个问题:
以下是代码: [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
答案 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>