Подтвердить что ты не робот

Какая разница между Dependency Property SetValue() и SetCurrentValue()

Причина, по которой я прошу об этом, - это то, что я рекомендовал @Greg D (от этот вопрос) вместо SetCurrentValue(), но посмотрите на docs и не видел, в чем разница. Или что означает "без изменения источника ценности"?

SetValue()

Устанавливает локальное значение свойства зависимости, заданное его идентификатором свойства зависимостей.

SetCurrentValue()

Устанавливает значение свойства зависимости без изменения его источника значений.

4b9b3361

Ответ 1

Указанная вами ссылка MSDN говорит об этом довольно хорошо:

Этот метод используется компонентом что программно устанавливает значение одного из своих свойств без отключение объявленного приложения использование имущества. Метод SetCurrentValue изменяет эффективная стоимость имущества, но существующие триггеры, привязки данных и стили будут продолжать работать.

Предположим, что вы пишете элемент управления TextBox, и вы обнаружили свойство Text, которое люди часто используют следующим образом:

<TextBox Text="{Binding SomeProperty}"/>

В вашем контрольном коде, если вы вызываете SetValue, вы переписываете привязку тем, что вы предоставляете. Однако если вы вызываете SetCurrentValue, убедитесь, что свойство принимает заданное значение, но не уничтожит никаких привязок.

Насколько мне известно, совет Грега неверен. Вы всегда должны использовать GetValue/SetValue из своего свойства оболочки CLR. SetCurrentValue более полезен в сценариях, где вам нужно свойство для получения заданного значения, но не хотите перезаписывать любые привязки, триггеры или стили, которые были настроены против вашего свойства.

Ответ 2

В дополнение к принятому ответу:

Я обнаружил, что этот пост довольно хорошо объясняет SetCurrentValue(). Обратите внимание на то, как система приоритета значения свойства зависимостей примет локальное значение над привязанным значением. Это объясняет неожиданное поведение комментаторов.