如何将属性添加到现有类型/控件

时间:2013-08-24 15:43:44

标签: c# wpf subclass

假设我有一个TextBox控件,我想为它添加一个简单的字符串属性,而不必创建一个继承自常规TextBox控件的新Textbox控件。这可能吗?

例如:

TextBox tx = new TextBox();
// I want something like the following
// tx.addProperty("propertyname", "properyvalue", typeof(string));

在WPF / C#中是否有这样的东西,在没有创建从常规TextBox控件继承的新Textbox控件的情况下,最简单的方法是什么?

2 个答案:

答案 0 :(得分:5)

您可以创建附加的依赖项属性,并将其应用于任何类型的控件。例如,对于TextBlock。以下是我的例子:

XAML

<Grid>
    <TextBlock Name="SampleTextBlock" Width="200" Height="30" 
               Background="AntiqueWhite" Text="Sample TextBlock" 
               local:MyDependencyClass.MyPropertyForTextBlock="TestString" />

    <StackPanel Width="100" Height="100" HorizontalAlignment="Left">
        <Button Name="GetValueButton" Content="GetValueButton" Click="GetValue_Click" />
        <Button Name="SetValueButton" Content="SetValueButton" Click="SetValue_Click" />
    </StackPanel>
</Grid>

Code behind

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void GetValue_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(MyDependencyClass.GetMyPropertyForTextBlock(SampleTextBlock));
    }

    private void SetValue_Click(object sender, RoutedEventArgs e)
    {
        MyDependencyClass.SetMyPropertyForTextBlock(SampleTextBlock, "New Value");

        MessageBox.Show(MyDependencyClass.GetMyPropertyForTextBlock(SampleTextBlock));
    }
}

public class MyDependencyClass : DependencyObject
{
    public static readonly DependencyProperty MyPropertyForTextBlockProperty;

    public static void SetMyPropertyForTextBlock(DependencyObject DepObject, string value)
    {
        DepObject.SetValue(MyPropertyForTextBlockProperty, value);
    }

    public static string GetMyPropertyForTextBlock(DependencyObject DepObject)
    {
        return (string)DepObject.GetValue(MyPropertyForTextBlockProperty);
    }

    static MyDependencyClass()
    {
        PropertyMetadata MyPropertyMetadata = new PropertyMetadata(string.Empty);

        MyPropertyForTextBlockProperty = DependencyProperty.RegisterAttached("MyPropertyForTextBlock",
                                                            typeof(string),
                                                            typeof(MyDependencyClass),
                                                            MyPropertyMetadata);
    }
}

或者您可以使用属性Tag,它只是为了存储其他信息而创建的。但有时候,这个属性可能会被其他目标所占据,或者因为他的名字而无法占据。使用直观的名称创建属性要好得多,例如:ValueForAnimationStringIdCanScrolling等。

答案 1 :(得分:4)

通常,执行此操作的最佳方法是从TextBox控件继承。与javascript不同,C#是statically typed language,因此您无法添加此类属性。

由于Textbox控件是DependencyObject,您也可以使用附加属性 - 请参阅Anatoliy Nikolaev在上方/下方的答案。这可能会更好,具体取决于您希望如何使用该属性。

如果您只想添加单条信息,可以使用Textbox的Tag属性,该属性是为此目的而设计的,可以使用任何对象。如果要添加多条信息,可以将Tag属性设置为值字典。