WPF 绑定到 UserControl 的 DependencyProperty 未按预期工作
WPF Binding to UserControl´s DependencyProperty not working as expected
我对 DependecyProperty 绑定有一些奇怪的问题。
为了让问题更简单,我创建了一些虚拟控件,它们具有相同的不良行为
我有一个 UserControl,它有一个在后面的代码中定义的 DependencyProperty:
public static readonly DependencyProperty TestValueProperty = DependencyProperty.Register("TestValue", typeof(string), typeof(Test), new PropertyMetadata(default(string)));
public string TestValue
{
get { return (string)GetValue(TestValueProperty); }
set { SetValue(TestValueProperty, value); }
}
这个属性用于XAML:
<Label Content="{Binding TestValue}" />
这个控件应该像这样在另一个控件中使用:
<views:Test TestValue="{Binding Settings.Setting123}" />
Settings
在视图模型中定义为 属性.
但是 Settings.Setting123
的内容在我的用户控件标签中不可见。
当写一些修复值而不是绑定时它工作正常:
<views:Test TestValue="Test" />
当然我要的不是固定值,而是绑定对象的内容。
任何提示这里出了什么问题?
提前致谢!
您没有共享足够的代码让任何人重现问题,但从字里行间来看,我猜 Label
在您的 UserControl
XAML 中。如果 TestValue
是 UserControl
的 属性,这可能会起作用:
<Label Content="{Binding TestValue, RelativeSource={RelativeSource AncestorType=UserControl}}" />
但是,您可能会这样做(并使其半工作,使用文字字符串)的一个原因是如果您使 UserControl
成为自己的 DataContext
。在那种情况下,那么问题是您将 UserControl
变成了自己的 DataContext
。如果你这样做了,绑定的 Binding
将在 UserControl
的上下文中被评估,它没有 Settings.Setting123
属性。
控件的 DataContext
的意思是,当您在其中一个控件属性 或其 XAML 中有一个 Binding
时,那是 Binding
去寻找你绑定的 属性 的地方。你明确地告诉它在错误的地方看。
如果您将 UserControl
设为自己的 DataContext
,则无法将任何内容绑定到它。这就是为什么你不应该那样做。它就像那些除了从墙上拔下插头什么都不做的机器之一。相反,在 UserControl
XAML 中使用上面的 {RelativeSource AncestorType=UserControl}
绑定。
我不应该猜测。您声称您创建了一个最小的可验证示例,但没有费心分享它。如果您分享它,我们可以放心地解决您的问题。
我对 DependecyProperty 绑定有一些奇怪的问题。 为了让问题更简单,我创建了一些虚拟控件,它们具有相同的不良行为
我有一个 UserControl,它有一个在后面的代码中定义的 DependencyProperty:
public static readonly DependencyProperty TestValueProperty = DependencyProperty.Register("TestValue", typeof(string), typeof(Test), new PropertyMetadata(default(string)));
public string TestValue
{
get { return (string)GetValue(TestValueProperty); }
set { SetValue(TestValueProperty, value); }
}
这个属性用于XAML:
<Label Content="{Binding TestValue}" />
这个控件应该像这样在另一个控件中使用:
<views:Test TestValue="{Binding Settings.Setting123}" />
Settings
在视图模型中定义为 属性.
但是 Settings.Setting123
的内容在我的用户控件标签中不可见。
当写一些修复值而不是绑定时它工作正常:
<views:Test TestValue="Test" />
当然我要的不是固定值,而是绑定对象的内容。 任何提示这里出了什么问题?
提前致谢!
您没有共享足够的代码让任何人重现问题,但从字里行间来看,我猜 Label
在您的 UserControl
XAML 中。如果 TestValue
是 UserControl
的 属性,这可能会起作用:
<Label Content="{Binding TestValue, RelativeSource={RelativeSource AncestorType=UserControl}}" />
但是,您可能会这样做(并使其半工作,使用文字字符串)的一个原因是如果您使 UserControl
成为自己的 DataContext
。在那种情况下,那么问题是您将 UserControl
变成了自己的 DataContext
。如果你这样做了,绑定的 Binding
将在 UserControl
的上下文中被评估,它没有 Settings.Setting123
属性。
控件的 DataContext
的意思是,当您在其中一个控件属性 或其 XAML 中有一个 Binding
时,那是 Binding
去寻找你绑定的 属性 的地方。你明确地告诉它在错误的地方看。
如果您将 UserControl
设为自己的 DataContext
,则无法将任何内容绑定到它。这就是为什么你不应该那样做。它就像那些除了从墙上拔下插头什么都不做的机器之一。相反,在 UserControl
XAML 中使用上面的 {RelativeSource AncestorType=UserControl}
绑定。
我不应该猜测。您声称您创建了一个最小的可验证示例,但没有费心分享它。如果您分享它,我们可以放心地解决您的问题。