我使用Jason Kemp's cool CueBanner
class进行"水印" WPF中的文本框:
<TextBox
hpext:CueBanner.Content="Find Text"
hpext:CueBanner.Padding="2,6,0,0"
/>
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中这样做,不应该吗?
答案 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
。