簡體   English   中英

如何在XAML中綁定UIElements?

[英]How to bind UIElements in XAML?

我有一節課:

class LinkedTextBox: TextBox
{
    public TextBox TextBoxA { get; set; }
    public TextBox TextBoxB { get; set; }
}

說我有兩個文本框:

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

如何在我的Xaml上指定TextBoxes?

我的測試:

(1)“ TypeBox的TypeConverter不支持從字符串轉換。

    <local:LinkedTextBox TextBoxA="txt1" TextBoxB="txt2" />

(2)“ A'Binding'不能在'LinkedTextBox'類型的'TextBoxA'屬性上設置。'Binding'只能在DependencyObject的DependencyProperty上設置。

    <local:LinkedTextBox 
        TextBoxA="{Binding ElementName=txt1}"  
        TextBoxB="{Binding ElementName=txt2}"  
        />

我認為有一種明顯的方法可做,但我不知道如何......

對。 你的第二個例子是正確的XAML,但它失敗了,因為TextBoxATextBoxB屬於錯誤的屬性。 Binding的目標必須是DependencyPropertyDependencyObject ,就像在錫上所說的那樣。 TextBox已經是一個DependencyObject ,你正在對它進行子類化,因此該部分需要處理。 定義DependencyProperty是微不足道的。

您需要定義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。 可能你想要一個附加屬性 ,這是一種特殊類型的依賴屬性。

UPDATE

OP希望添加說明文本框之間關系的視覺元素。 如果你想添加一個視覺疊加層,那么WPF的方法就是寫一個Adorner 因此,您將使用TextBoxATextBoxB依賴項屬性編寫某種TextBoxLinkingAdorner ,並將其應用於主文本框,這取決於您的要求甚至可能不必是子類。

您的依賴屬性可能需要在其值更改時執行一些操作; 如果是這樣,假設一個名為TextBoxLinkerAdornerAdorner子類,它們看起來更像這樣:

    #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

如果您在文本框中查看的是它們的大小和位置,您可以編寫一個鏈接任意UIElements而不僅僅是文本框的裝飾器。 天空是極限! 如果你能夢想它,你可以裝飾它!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM