WPF 附加属性数据绑定

问题描述 投票:0回答:3

我尝试使用带有附加属性的绑定。但无法让它工作。

public class Attached
{
    public static DependencyProperty TestProperty =
        DependencyProperty.RegisterAttached("TestProperty", typeof(bool), typeof(Attached),
        new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault | FrameworkPropertyMetadataOptions.Inherits));

    public static bool GetTest(DependencyObject obj)
    {
        return (bool)obj.GetValue(TestProperty);
    }

    public static void SetTest(DependencyObject obj, bool value)
    {
        obj.SetValue(TestProperty, value);
    }
}

XAML 代码:

<Window ...>
    <StackPanel local:Attached.Test="true" x:Name="f">
        <CheckBox local:Attached.Test="true" IsChecked="{Binding (local:Attached.Test), Mode=TwoWay, RelativeSource={RelativeSource Self}}" />
        <CheckBox local:Attached.Test="true" IsChecked="{Binding (local:Attached.Test), Mode=TwoWay}" />
    </StackPanel>
</Window>

以及绑定错误:

System.Windows.Data Error: 40 : BindingExpression path error: '(local:Attached.Test)' property not found on 'object' ''StackPanel' (Name='f')'. BindingExpression:Path=(local:Attached.Test); DataItem='StackPanel' (Name='f'); target element is 'CheckBox' (Name=''); target property is 'IsChecked' (type 'Nullable`1')
wpf xaml binding attached-properties
3个回答
202
投票

不管你信不信,只需添加

Path=
并在绑定到附加属性时使用括号即可:

IsChecked="{Binding Path=(local:Attached.Test), Mode=TwoWay, RelativeSource={RelativeSource Self}}"

此外,您对

RegisterAttached
的调用应传入“Test”作为属性名称,而不是“TestProperty”。


22
投票

我更愿意将此作为对 Kent 答案的评论,但由于我没有足够的代表来这样做...只是想指出,从 WPF 4.5 开始,不再需要添加

Path=
。但是附加的属性名称仍然需要用括号括起来。


-3
投票

安装支架即可。我必须将父级

contentcontrol
自动化 id 绑定到
textblock
中的
datatemplate
。自动化 ID 是附加属性。

我将属性放在括号中并且绑定有效。

AutomationProperties.AutomationId="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ContentControl},Path=(AutomationProperties.AutomationId)}" 
© www.soinside.com 2019 - 2024. All rights reserved.