Как я могу использовать свое унаследованное свойство в пользовательском элементе управления? - PullRequest
2 голосов
/ 14 сентября 2011

У меня есть класс UserControl с именем A, который содержит свойство 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 Ответ

1 голос
/ 14 сентября 2011

Это потому, что вы создали стандартное свойство зависимости. Если вы хотите иметь возможность установить его для других типов, кроме A, то вместо этого вы хотите создать присоединенное свойство. Это займет всего несколько изменений кода:

  • Зарегистрируйте его, вызвав DependencyProperty.RegisterAttached (вместо .Register)
  • Добавьте статические методы GetBorder2 и SetBorder2 в класс 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...