2010-11-20 10 views
42

Powodem, dla którego o to pytam jest to, że polecono mi @Greg D (z this question) zamiast używać SetCurrentValue(), ale przyjrzyj się dokumentom i nie " t zobaczyć jaka jest różnica. A co oznacza "bez zmiany źródła wartości"?Jaka jest różnica między właściwością Dependency Property SetValue() a SetCurrentValue()

SetValue()

Ustawia lokalną wartość właściwości zależności, określony przez identyfikator właściwości jego zależność.

SetCurrentValue()

Ustawia wartość właściwości zależności bez zmieniania jej źródła wartości.

Odpowiedz

46

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.

+2

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? –

+1

@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. –

+2

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? –

2

nawiązaniu do przyjętej odpowiedź:

stwierdziliśmy, że this post wyjaśnia SetCurrentValue() całkiem dobrze. Zwróć uwagę, w jaki sposób system pierwszeństwa wartości zależności Dependency Property pobiera lokalną wartość ponad powiązaną wartość. Co tłumaczy nieoczekiwane zachowanie komentatorów.

Powiązane problemy