如何声明一个也可以在没有绑定的情况下设置的 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));

我声明了这个新属性,但我仍然无法绑定任何东西,只接受原始值

【问题讨论】:

不知道你在这里问什么。所有依赖属性都可以像普通属性一样使用。此外,它们可以由样式设置器、动画等绑定或分配其值。 当你在你的控件类中声明一个布尔依赖属性时,你可以写&lt;local:MyControl MyBool="True"/&gt;或者&lt;local:MyControl MyBool="Binding SomeBooleanSourceProperty"/&gt; 我更新了我的帖子以解释更多@Clemens 您只需使用Property="Binding Name"Property="Whatever" 而不是PropertyPath="Name"。 “属性路径”显然只对 Binding 有意义。 你的意思是我可以在 .xaml 而不是 .cs 文件中直接声明一个 DependencyProperty 吗? 【参考方案1】:

您不应在回调中创建新绑定。事实上,你根本不需要任何回调。

将依赖属性重命名为“Text”之类的更好的名称,并将StringBoxText 属性绑定到依赖属性的当前值,如下所示:

<TextBox x:Name="StringBox"
    Text="Binding Text, RelativeSource=RelativeSource AncestorType=local:NotEmptyStringTextBox,
        UpdateSourceTrigger=PropertyChanged" />

然后您可以像往常一样设置或绑定依赖属性。

如果你真的想要一个“PropertyPath”属性,它不应该是一个可以绑定某些东西的依赖属性,而是一个简单的 CLR 属性,你可以将它设置为代表 namestring /em> 要绑定的属性。

例如,ItemsControlDisplayMemberPath 属性是如何实现的。

【讨论】:

如果你不介意看看我的编辑,我以为我做了你的意思,但我仍然无法绑定任何东西 所以你已经定义了一个bool 依赖属性。你想用它做什么不起作用? 我可以在我的 UserControl 中成功使用它(我使用转换器将它绑定到 Visibility),但是每当我使用包含我的 Test 属性的 userControl 时,我无法将任何东西绑定到 Test,只能给它一个静态 True或假 为什么“无法绑定”是什么意思?发生什么了?以及如何绑定? Clemens 发现了一个错字,纠正了我的构建错误 ^^"

以上是关于如何声明一个也可以在没有绑定的情况下设置的 DependencyProperty的主要内容,如果未能解决你的问题,请参考以下文章

c#如何让DataGridView控件在没有绑定数据源的情况下显示网格线?

如何在没有情节提要的情况下设置 ViewController 的框架

C#如何在没有 XAML 的情况下创建到父元素的(两种方式)数据绑定

可以在没有主体的情况下调用声明的函数

Linux串口相关的操作及绑定

Vue双向绑定监听哪些数据