Link MSDN podałeś mówi całkiem dobrze:
Ta metoda jest używana przez komponent że programowo ustawia wartość jednego z własnymi właściwościami bez wyłączenie ogłoszony aplikacja na używania własność. Metoda SetCurrentValue zmienia efektywną wartość właściwości, ale istniejące wyzwalacze, powiązania danych i style nadal będą działały.
Załóżmy piszesz kontrolę TextBox
a ty narażone Text
właściwość, że ludzie często używać w następujący sposób:
<TextBox Text="{Binding SomeProperty}"/>
W kodzie kontrolki, jeśli zadzwonisz SetValue
będzie nadpisać wiązanie z czymkolwiek dostarczasz. Jeśli jednak wywołasz SetCurrentValue
, zapewni to, że właściwość przybierze określoną wartość, ale nie zniszczy żadnych powiązań.
Zgodnie z moją wiedzą, porady Grega są nieprawidłowe. Zawsze należy używać GetValue
/SetValue
z właściwości opakowania CLR. SetCurrentValue
jest bardziej przydatny w scenariuszach, w których potrzebna jest właściwość do przyjęcia określonej wartości, ale nie chce zastępować żadnych powiązań, wyzwalaczy ani stylów skonfigurowanych względem właściwości.
Na blogu Vincenta Sibala (http://blogs.msdn.com/b/vinsibal/archive/2009/05/21/the-control-local-values-bug-solution-and-new-wpf-4- 0-related-apis.aspx) możesz przeczytać na końcu. "W przypadku programisty kontrolnego, ogólnym zaleceniem jest zawsze używać DependencyObject.SetCurrentValue przez DependencyObject.SetValue w kodzie kontroli. Zauważysz, że nasze formanty magazynowe w strukturze 4.0 zostały zaktualizowane w celu użycia tego interfejsu API zamiast ustawiania właściwości za pomocą lokalne wartości. " Oboje prawdopodobnie macie rację, ale czy możecie wyjaśnić tutaj różnicę i zalecenie z bloga? –
@Meleak: Szczerze mówiąc, myślę, że ten post jest trochę niejasny. Myślę, że chciał powiedzieć, że 'SetCurrentValue' powinno być używane gdziekolwiek w twojej kontroli, gdzie chcesz * wewnętrznie * modyfikować wartość właściwości zależności.Rzeczywiście, jeśli otworzysz swój przykładowy projekt, zobaczysz, że nadal używa on 'GetValue' i' SetValue' w opakowaniu właściwości CLR. Rzeczywiście, jeśli rozwiążesz otwarty reflektor przeciwko .NET 4.0 zobaczysz, że i tak jest nadal. –
Hmm, do tej pory użyłem 'SetValue' jako wygenerowanego przez Visual Studio, działa dobrze. Naprawdę nie rozumiem, co masz na myśli, niszcząc wiązanie. Po pierwszej zmianie wartości moje wiązania nie zostaną zniszczone? bo czy nadal mogę wprowadzać zmiany, a oprawa wciąż działa? –