Ссылка MSDN вы предоставили говорит, что это очень хорошо:
Этот метод используется компонентом , который программно задает значение одного из его собственных свойств без отключить приложение заявленного использования из имущество. Метод SetCurrentValue изменяет действительное значение свойства , но существующие триггеры, привязки данных и стили будут продолжать работать.
Предположим, что вы пишете контроль TextBox
и вы выставили Text
свойство, что люди часто используют следующим образом:
<TextBox Text="{Binding SomeProperty}"/>
В коде элемента управления, если вы звоните SetValue
вы перезаписать связывание с тем, что вы предоставляете. Однако, если вы вызываете SetCurrentValue
, это гарантирует, что свойство принимает заданное значение, но не уничтожит никаких привязок.
Насколько я знаю, совет Грега неверен. Вы всегда должны использовать GetValue
/SetValue
из вашего свойства оболочки CLR. SetCurrentValue
более полезен в сценариях, где требуется свойство принимать заданное значение, но не нужно переписывать любые привязки, триггеры или стили, настроенные против вашего свойства.
В блоге 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 вместо того, чтобы устанавливать свойства с помощью местных ценностей ". Вы оба, вероятно, правы, но можете ли вы объяснить разницу здесь и рекомендации из блога? –
@Meleak: Честно говоря, я думаю, что сообщение немного неясно. Я думаю, он хотел сказать, что 'SetCurrentValue' должен использоваться в любом месте вашего элемента управления, где вы хотите * внутренне * изменить значение свойства зависимостей.Действительно, если вы откроете свой пример проекта, вы увидите, что он все еще использует 'GetValue' и' SetValue' в оболочке свойств CLR. Действительно, если вы взломаете открытый отражатель против .NET 4.0, вы увидите, что это все еще так. –
Хмм, до сих пор я использовал 'SetValue' в качестве своего сгенерированного Visual Studio, он отлично работает. Я действительно не понимаю, что вы имеете в виду, уничтожив привязку. После изменения 1-го значения моя привязка не будет уничтожена? Потому что я все еще могу внести изменения, и привязка все еще работает? –