Public vs Private AttachedProperties - PullRequest
       34

Public vs Private AttachedProperties

2 голосов
/ 20 сентября 2011

Где имеет смысл иметь AttachedProperties как private против public? Обычно это определяют как (пример):

public static readonly DependencyProperty CommandProperty = 
DependencyProperty.RegisterAttached(
            "Command",
            typeof(ICommand),
            typeof(Click),
            new PropertyMetadata(OnSetCommandCallback));

Но я также видел примеры, когда некоторые свойства private static readonly...

Каковы последствия, если я изменю вышеприведенное CommandProperty на private сейчас? Похоже, он все еще доступен в моем XAML intellisense, если я это сделаю. Что мне здесь не хватает?

1 Ответ

4 голосов
/ 20 сентября 2011

Разница в том, что вы не сможете получить доступ к DependencyProperty извне класса. Это может иметь смысл, если статические методы Get и Set также являются закрытыми, (в прикрепленном поведении, где вам нужно хранить некоторые локальные данные поведения, например) , но не иначе (и я не думаю, что я Я когда-либо видел это с публичными Get и Set).

Примером, когда вы хотите использовать DependencyProperty, является DependencyPropertyDescriptor. С общедоступным DependencyProperty вы можете сделать следующее

DependencyPropertyDescriptor de =
    DependencyPropertyDescriptor.FromProperty(Click.CommandProperty, typeof(Button));

de.AddValueChanged(button1, delegate(object sender, EventArgs e)
{
    // Some logic..
});

Но если DependencyProperty является закрытым, приведенный выше код не будет работать.

Однако следующее будет нормально работать как для публичного, так и для частного DependencyProperty (если статические методы Get и Set являются общедоступными) , поскольку класс владельца может получить доступ к приватному DependencyProperty. Это также относится к привязкам и значениям, установленным через Xaml, где GetValue и SetValue вызываются напрямую.

Click.SetCommand(button, ApplicationCommands.Close);
ICommand command = Click.GetCommand(button);

Если вы посмотрите структуру, вы заметите, что все открытые вложенные свойства имеют открытые DependencyProperty, например Grid.RowProperty и Storyboard.TargetNameProperty. Так что если прикрепленное свойство является публичным, используйте публичное DependencyProperty

...