以编程方式绑定WPF中的附加属性

时间:2016-04-08 17:31:39

标签: wpf xaml data-binding attached-properties

我使用Jason Kemp's cool CueBanner class进行"水印" WPF中的文本框:

<TextBox 
    hpext:CueBanner.Content="Find Text"
    hpext:CueBanner.Padding="2,6,0,0"
    />

Don't tell Ayn Rand

Jason的代码以编程方式创建ContentPresenter,将其内容设置为CueBanner.Content,将ContentPresenter添加到Adorner子类,并在适当时显示。

他的代码从装饰控件的填充和边距推断出ContentPresenter,但我添加了hpext:CueBanner.Padding,所以我可以将其显式设置为我更喜欢的值。

contentPresenter.Margin = CueBanner.GetPadding(adornedElement);

到目前为止一切顺利。

这里有麻烦:它有效,但我想绑定它。

var binding = new Binding("hpext:CueBanner.Padding") { Source = adornedElement };

BindingOperations.SetBinding(contentPresenter, ContentPresenter.MarginProperty, binding);

但是我对源属性的路径使用了什么? "hpext:CueBanner.Padding"不起作用,它不应该工作;那个命名空间并不存在。 "CueBanner.Padding""(CueBanner.Padding)"没有喜悦。 "MyProject.Extensions.CueBanner.Padding"也无法工作,我无法理解为什么应该这样做。

我无法看到PropertyPath中看起来有用的任何内容,但是当我读到我的思绪开始变得有点空白时。

我应该只是在XAML中这样做,不应该吗?

2 个答案:

答案 0 :(得分:6)

您可以直接从附加属性创建PropertyPath,如下所示:

var binding = new Binding
{
    Path = new PropertyPath(CueBanner.PaddingProperty), // here
    Source = adornedElement
};

答案 1 :(得分:1)

我认为问题在于绑定的来源应该是TextBox,而不是adornedElement。基于this(显示如何通过代码绑定到Grid.Row),应该像这样创建绑定:

var binding = new Binding("(CueBanner.Padding)") { Source = textbox };

BindingOperations.SetBinding(textBox, MyProject.Extensions.CueBanner.PaddingProperty, binding);

(将MyProject.Extensions.CueBanner.PaddingProperty替换为您注册的实际AttachedProperty