如何在XAML中绑定UIElements?

时间:2016-03-24 16:11:58

标签: c# wpf xaml data-binding dependency-properties

我有一个班级:

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}"  
        />

我认为有一种明显的方法,但我不知道如何......

1 个答案:

答案 0 :(得分:3)

右。您的第二个示例是正确的XAML,但它失败了,因为TextBoxATextBoxB是错误的属性。 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的装饰器,而不仅仅是文本框。天空是极限!如果你能梦想它,你可以装饰它!