我有一个班级:
class LinkedTextBox: TextBox
{
public TextBox TextBoxA { get; set; }
public TextBox TextBoxB { get; set; }
}
说我有两个文本框:
<TextBox x:Name="txt1" />
<TextBox x:Name="txt2" />
如何在我的Xaml上指定TextBoxes?
我的测试:
(1)“”TextBox“的TypeConverter不支持从字符串转换。”
<local:LinkedTextBox TextBoxA="txt1" TextBoxB="txt2" />
(2)“ A'Binding'不能在'LinkedTextBox'类型的'TextBoxA'属性上设置。'Binding'只能在DependencyObject的DependencyProperty上设置。”< / p>
<local:LinkedTextBox
TextBoxA="{Binding ElementName=txt1}"
TextBoxB="{Binding ElementName=txt2}"
/>
我认为有一种明显的方法,但我不知道如何......
答案 0 :(得分:3)
右。您的第二个示例是正确的XAML,但它失败了,因为TextBoxA
和TextBoxB
是错误的属性。 Binding
的目标必须是DependencyProperty
的{{1}},就像在锡上所说的那样。 DependencyObject
已经是TextBox
,您可以对其进行细分,以便对此部分进行处理。定义DependencyObject
是微不足道的。
您可以像这样定义DependencyProperty
,同样定义TextBoxA
:
TextBoxB
但是你的意图在这里是什么?你想达到什么目的? 很可能你可以通过以正常方式将现有属性彼此绑定来实现,而不需要任何这些子类monkeyshines。可能你想要一个attached property,这是一种特殊类型的依赖属性。
OP希望添加说明文本框之间关系的视觉元素。如果要添加可视叠加层,WPF的方法就是编写an Adorner。因此,您要编写某种具有public class LinkedTextBox : TextBox
{
#region TextBoxA Property
public TextBox TextBoxA
{
get { return (TextBox)GetValue(TextBoxAProperty); }
set { SetValue(TextBoxAProperty, value); }
}
// Careful with the parameters you pass to Register() here.
public static readonly DependencyProperty TextBoxAProperty =
DependencyProperty.Register("TextBoxA", typeof(TextBox), typeof(LinkedTextBox),
new PropertyMetadata(null));
#endregion TextBoxA Property
}
和TextBoxLinkingAdorner
依赖项属性的TextBoxA
,并将其应用于主文本框,根据您的要求,甚至可能不必一个子类。
您的依赖项属性可能需要在其值更改时执行一些操作;如果是这样,他们看起来更像这样,假设一个名为TextBoxB
的{{1}}子类:
Adorner
如果您在文本框中查看的是他们的大小和位置,您可以编写一个链接任意TextBoxLinkerAdorner
的装饰器,而不仅仅是文本框。天空是极限!如果你能梦想它,你可以装饰它!