2010-11-20 3 views
42

Причина, по которой я прошу об этом, заключается в том, что я рекомендовал @Greg D (от this question) вместо SetCurrentValue() вместо этого, но посмотрите на документы и didn ' Посмотрите, в чем разница. Или что означает «без изменения источника ценности»?В чем разница между свойствами Dependency SetValue() и SetCurrentValue()

SetValue()

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

SetCurrentValue()

Задает значение свойства зависимостей, не меняя источник значения.

ответ

46

Ссылка MSDN вы предоставили говорит, что это очень хорошо:

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

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

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

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

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

+2

В блоге Vincent Sibal (http://blogs.msdn.com/b/vinsibal/archive/2009/05/21/the-control-local-values-bug-solution-and-new-wpf-4- 0-related-apis.aspx), вы можете прочитать следующее в конце. «Для разработчика элемента управления общая рекомендация заключается в том, чтобы всегда использовать DependencyObject.SetCurrentValue над DependencyObject.SetValue в коде управления. Вы заметите, что наши элементы управления запасами в платформе 4.0 были обновлены для использования этого API вместо того, чтобы устанавливать свойства с помощью местных ценностей ". Вы оба, вероятно, правы, но можете ли вы объяснить разницу здесь и рекомендации из блога? –

+1

@Meleak: Честно говоря, я думаю, что сообщение немного неясно. Я думаю, он хотел сказать, что 'SetCurrentValue' должен использоваться в любом месте вашего элемента управления, где вы хотите * внутренне * изменить значение свойства зависимостей.Действительно, если вы откроете свой пример проекта, вы увидите, что он все еще использует 'GetValue' и' SetValue' в оболочке свойств CLR. Действительно, если вы взломаете открытый отражатель против .NET 4.0, вы увидите, что это все еще так. –

+2

Хмм, до сих пор я использовал 'SetValue' в качестве своего сгенерированного Visual Studio, он отлично работает. Я действительно не понимаю, что вы имеете в виду, уничтожив привязку. После изменения 1-го значения моя привязка не будет уничтожена? Потому что я все еще могу внести изменения, и привязка все еще работает? –

2

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

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