如何在用户控件中使用继承的属性?

时间:2011-09-13 21:44:23

标签: c# wpf

我有一个名为A的UserControl类,其中一个包含Border属性。然后其他类继承自A类,但我不能使用我的新属性。

public class A : UserControl
{

public A()
{
    Border2 = new Border();
    Border2.BorderBrush = Media.Brushes.LightGray;
}

public static readonly DependendyProperty Border2Property = DependencyProperty.Register("Border2", typeof(Border), typeof(A));

public Border Border2
{
    get { return (Border)GetValue(Border2Property); }
    set { SetValue(Border2Property, value); }
}
}

然后当我使用另一个继承自A的类时,我不能使用这个Border2属性,我写的是:

<local:A.Border2></...

但是它告诉我Border2属性不支持Grid类型的值。

1 个答案:

答案 0 :(得分:1)

那是因为你已经创建了一个标准的依赖属性。如果您希望能够将其设置为除A之外的其他类型,则需要创建附加属性。这只需要进行一些代码更改:

  • 通过调用DependencyProperty.RegisterAttached(而不是.Register)注册它
  • 将静态GetBorder2SetBorder2方法添加到A类。即使您的代码没有调用这些方法,它们也是模式的一部分,需要在那里 - 它们是如何你告诉编译器是的,你确实希望人们能够在XAML中设置这个附加属性。

例如:

public static readonly DependencyProperty Border2Property =
    DependencyProperty.RegisterAttached("Border2", typeof(Border), typeof(A));

public static Border GetBorder2(DependencyObject obj)
{
    return (Border) obj.GetValue(Border2Property);
}
public static void SetBorder2(DependencyObject obj, Border2 value)
{
    obj.SetValue(Border2Property, value);
}

如果您的属性仅适用于某些元素类型 - 例如如果它只应用于FrameworkElement及其后代,或者适用于Panel及其后代,或类似的东西 - 那么将其用作GetBorder2和SetBorder2的第一个参数的类型。