如何声明一个也可以在没有绑定的情况下设置的 DependencyProperty
Posted
技术标签:
【中文标题】如何声明一个也可以在没有绑定的情况下设置的 DependencyProperty【英文标题】:How to declare a DependencyProperty that could also be set without binding 【发布时间】: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 吗?
【参考方案1】:
您不应在回调中创建新绑定。事实上,你根本不需要任何回调。
将依赖属性重命名为“Text”之类的更好的名称,并将StringBox
的Text
属性绑定到依赖属性的当前值,如下所示:
<TextBox x:Name="StringBox"
Text="Binding Text, RelativeSource=RelativeSource AncestorType=local:NotEmptyStringTextBox,
UpdateSourceTrigger=PropertyChanged" />
然后您可以像往常一样设置或绑定依赖属性。
如果你真的想要一个“PropertyPath”属性,它不应该是一个可以绑定某些东西的依赖属性,而是一个简单的 CLR 属性,你可以将它设置为代表 namestring /em> 要绑定的属性。
例如,ItemsControl
的 DisplayMemberPath
属性是如何实现的。
【讨论】:
如果你不介意看看我的编辑,我以为我做了你的意思,但我仍然无法绑定任何东西 所以你已经定义了一个bool
依赖属性。你想用它做什么不起作用?
我可以在我的 UserControl 中成功使用它(我使用转换器将它绑定到 Visibility),但是每当我使用包含我的 Test 属性的 userControl 时,我无法将任何东西绑定到 Test,只能给它一个静态 True或假
为什么“无法绑定”是什么意思?发生什么了?以及如何绑定?
Clemens 发现了一个错字,纠正了我的构建错误 ^^"以上是关于如何声明一个也可以在没有绑定的情况下设置的 DependencyProperty的主要内容,如果未能解决你的问题,请参考以下文章
c#如何让DataGridView控件在没有绑定数据源的情况下显示网格线?
如何在没有情节提要的情况下设置 ViewController 的框架