Как работают DependencyProperties? - PullRequest
1 голос
/ 17 января 2012

У меня есть вопрос о свойствах зависимостей WPF. Когда свойство зависимости зарегистрировано, оно регистрируется как общедоступное статическое только для чтения.

  1. Если оно доступно только для чтения, как можно изменить значение?
  2. Если он статический, то существует только один экземпляр. Допустим, у меня есть зависимость свойство какое-то свойство для кнопки класса. Если у меня есть две кнопки, которые имеют разные значения некоторой собственности. Как WPF справляется с этим?

Я немного растерялся. Заранее благодарю за помощь.

Ответы [ 4 ]

2 голосов
/ 17 января 2012
  1. Переменная свойства DependencyProperty помечена readonly;в .NET это означает, что только переменная только для чтения . Состояние объекта, на который ссылается переменная, все еще можно изменить .Для получения дополнительной информации о том, как readonly работает, см. Эту статью MSDN .

  2. Когда задано свойство DependencyProperty, требуется две вещи: значение свойства,и экземпляр типа-владельца, для которого должно быть установлено свойство .Система DependencyObject / DependencyProperty управляет тем, какие экземпляры имеют назначенные им значения.

DependencyProperty является статическим для класса, поэтому существует один единственный экземпляр DependencyProperty, отвечающий за управление состоянием DP для всех экземпляров.Относительно того, почему это требует много объяснений о DependencyObjects.

1 голос
/ 17 января 2012

Когда вы изменяете значение DependencyProperty, вы делаете именно это: изменяете его значение.Вы не меняете ссылку на экземпляр DependencyProperty.Следовательно, допустимо пометить его как readonly.Это похоже на наличие экземпляра некоторого класса.Вы можете пометить этот экземпляр readonly, в то же время имея возможность изменять внутренние значения класса.то есть:

private readonly List<string> mSomeCollection = new List<string>();

// Modifying the collection is allowed
mSomeCollection.Add(...);
mSomeCollection.Remove(...);

// Re-assigning the mSomeCollection variable is disallowed with readonly specified
mSomeCollection = new List<string>();

Что касается вопроса статического экземпляра, я полагаю, что он имеет какое-то отношение к способу установки значений DependencyProperty - они устанавливаются в соответствии с целью свойства, а не ссобственность сама (думаю).Я не совсем уверен, как эта часть работает (мне нужно прочитать об этом), но взгляните на MSDN для обзора свойств зависимостей, которые могут помочь понять это.

0 голосов
/ 17 января 2012

DependencyProperties работает аналогично Dictionary<object,object>.Вы всегда устанавливаете значение для объекта, а не значение для самого DependencyProperty.Вот почему это может быть статичным.Это также статично, потому что так быстрее.

0 голосов
/ 17 января 2012

Объект, который вы получаете от Register(...), является дескриптором DependencyProperty. Это только для чтения; Вы не можете изменить свойства свойства - метаданные свойства, если хотите. (Например, вы не можете изменить поведение наследования.)

Однако можно изменить значение свойства, используя метод SetValue(...). И чтобы использовать ваше свойство из XAML, вы должны объявить свойство CLR оболочки для вашего DependencyProperty, как в примере в связанной статье.

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