【发布时间】:2021-01-29 23:43:00
【问题描述】:
我知道我可以这样声明一个新的 DependencyProperty:
public String PropertyPath
{
get { return (String)GetValue(PropertyPathProperty); }
set { SetValue(PropertyPathProperty, value); }
}
public static readonly DependencyProperty PropertyPathProperty =
DependencyProperty.Register(nameof(PropertyPath), typeof(String),
typeof(NotEmptyStringTextBox),
new FrameworkPropertyMetadata(PropertyPath_PropertyChanged));
protected static void PropertyPath_PropertyChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
var ctl = d as NotEmptyStringTextBox;
var binding = new Binding(ctl.PropertyPath)
{
ValidationRules = { new NotEmptyStringRule() },
// Optional. With this, the bound property will be updated and validation
// will be applied on every keystroke.
UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
};
ctl.StringBox.SetBinding(TextBox.TextProperty, binding);
}
但是UserControl只能接收到一个字符串,该字符串带有要绑定的属性的名称,并绑定到它。
我想要的是能够拥有与“经典”属性相同的功能,您可以绑定到这些属性,也可以提供静态值。 我的用法是修改 UserControl 的显示状态的布尔值,可以使用固定值静态修改,也可以使用绑定动态修改,这一切都取决于用例。
也许我一开始创建依赖属性的方式不正确,但这是我可以使用它的方法:
<inputboxes:NotEmptyStringTextBox
Grid.Column="1"
PropertyPath="Name"/>
这将绑定 DataContext 中的“Name”属性,但我不能将它与原始字符串一起使用,因为它会产生 BindingExpression 错误:“property not found”
编辑: 我现在尝试了以下方法:
public bool Test
{
get { return (bool)GetValue(TestProperty); }
set { SetValue(TestProperty, value); }
}
public static readonly DependencyProperty TestProperty =
DependencyProperty.Register(nameof(Test), typeof(bool),
typeof(DamageTemplateListEditableUserControl));
我声明了这个新属性,但我仍然无法绑定任何东西,只接受原始值
【问题讨论】:
-
不知道你在这里问什么。所有依赖属性都可以像普通属性一样使用。此外,它们可以由样式设置器、动画等绑定或分配其值。
-
当你在你的控件类中声明一个布尔依赖属性时,你可以写
<local:MyControl MyBool="True"/>或者<local:MyControl MyBool="{Binding SomeBooleanSourceProperty}"/>。 -
我更新了我的帖子以解释更多@Clemens
-
您只需使用
Property="{Binding Name}"或Property="Whatever"而不是PropertyPath="Name"。 “属性路径”显然只对 Binding 有意义。 -
你的意思是我可以在 .xaml 而不是 .cs 文件中直接声明一个 DependencyProperty 吗?
标签: c# wpf xaml dependency-properties