C# 如何在XAML中绑定UIElements?

C# 如何在XAML中绑定UIElements?,c#,wpf,xaml,data-binding,dependency-properties,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上指定文本框 我的测试: (1) “文本框”的类型转换器不支持从

我有一门课:

class LinkedTextBox: TextBox
{
    public TextBox TextBoxA { get; set; }
    public TextBox TextBoxB { get; set; }
}
假设我有两个文本框:

    <TextBox x:Name="txt1" />
    <TextBox x:Name="txt2" />

如何在Xaml上指定文本框

我的测试:

(1) “文本框”的类型转换器不支持从字符串转换。


(2) “不能在“LinkedTextBox”类型的“TextBoxA”属性上设置“Binding”。只能在DependencyObject的DependencyProperty上设置“Binding”。



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

对。第二个示例是正确的XAML,但它失败了,因为
TextBoxA
TextBoxB
是错误的属性类型。
绑定的目标必须是
DependencyObject
dependencProperty
,如tin上所述
TextBox
已经是一个
DependencyObject
,您正在对它进行子类化,以便处理该部分。而定义一个
依赖性属性
是微不足道的

您可以这样定义
TextBoxA
,同样地定义
TextBoxB

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
}
但你在这里的意图是什么?你想完成什么?很可能,您可以通过以正常方式将现有属性相互绑定来实现,而不需要这些子类monkeyshines。您可能需要,这是一种特殊类型的依赖属性

更新 OP希望添加说明文本框之间关系的视觉元素。如果要添加可视覆盖,WPF的方法是编写。因此,您可以使用
TextBoxA
TextBoxB
依赖属性编写某种
textboxlinkingadarner
,并将其应用于主文本框,根据您的需求,主文本框甚至不必是子类

当依赖项属性的值发生变化时,它们可能需要做一些工作;如果是这样的话,它们看起来更像这样,假设一个名为
TextBoxLinkerAdorner
Adorner子类:

    #region TextBoxA Property
    public TextBox TextBoxA
    {
        get { return (TextBox)GetValue(TextBoxAProperty); }
        set { SetValue(TextBoxAProperty, value); }
    }


    public static readonly DependencyProperty TextBoxAProperty =
        DependencyProperty.Register("TextBoxA", typeof(TextBox), 
            typeof(TextBoxLinkerAdorner),
            new FrameworkPropertyMetadata(null,
                    FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
                    TextBoxA_PropertyChanged)
                        { DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });

    protected static void TextBoxA_PropertyChanged(DependencyObject d, 
        DependencyPropertyChangedEventArgs e)
    {
        var obj = d as TextBoxLinkerAdorner;
    }
    #endregion TextBoxA Property

如果您只关注文本框的大小和位置,那么您可以编写一个装饰器来链接任意
ui元素
,而不仅仅是文本框。天空是极限!如果你能梦想它,你就能装饰它

我将在视觉上“链接”文本框(实际上是绘制线条),更改两者的视觉效果,可能会更改位置,然后处理两者的文本,在LinkedTextBox中处理并显示结果。我知道通常的方法是直接绑定属性,但是我需要处理很多属性,我认为当我可以直接绑定主UIElement时,绑定十几个属性是非常糟糕的。我将立即阅读有关附加属性的信息,谢谢@点击OK啊,现在我知道你来自哪里了。您可能想看一看,WPFish(除其他外)“在UIElement上覆盖视觉装饰”的方法有哪些。我认为,AdornerLayer应该属于文本框的父级。
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
}
    #region TextBoxA Property
    public TextBox TextBoxA
    {
        get { return (TextBox)GetValue(TextBoxAProperty); }
        set { SetValue(TextBoxAProperty, value); }
    }


    public static readonly DependencyProperty TextBoxAProperty =
        DependencyProperty.Register("TextBoxA", typeof(TextBox), 
            typeof(TextBoxLinkerAdorner),
            new FrameworkPropertyMetadata(null,
                    FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
                    TextBoxA_PropertyChanged)
                        { DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });

    protected static void TextBoxA_PropertyChanged(DependencyObject d, 
        DependencyPropertyChangedEventArgs e)
    {
        var obj = d as TextBoxLinkerAdorner;
    }
    #endregion TextBoxA Property