2009-03-10 10 views
12

Jakie są różnice między tworzeniem wiążącego odniesienia do siebie poprzez nazwę a samo-odwołanie za pośrednictwem RelativeSource?Różnice między ElementName = "<Me>" i RelativeSource siebie?

Na przykład:

<!-- Self referential via name --> 
<Window ... 
    x:Name="This" 
    DataContext="{Binding Path=Data, ElementName=This}"/> 

kontra

<!-- Self referential via RelativeSource --> 
<Window ... 
    x:Name="This" 
    DataContext="{Binding Path=Data, RelativeSource={RelativeSource Self}}"/> 

W moim projekcie wydają się zachowywać identycznie, ale używam je bezpośrednio w oknie. Oznacza to, że od razu preferuję ten pierwszy, ponieważ jest mniej pisania.

Czy jedyną korzyścią RelativeSource jest jego zdolność do samoodniesienia się w (np.) Szeroko używanym stylu? Czy jest jakaś dodatkowa różnica semantyczna?

Odpowiedz

8

Zastrzeżenie: Nie czarodziejem WPF

Kiedy są wiążące bezpośrednio na elemencie WPF jak w przykładzie nie ma żadnej różnicy. "To" jest możliwe do rozwiązania i będzie wiązało się z tym samym przedmiotem, co Self.

Podejrzewam, że różnica polega na wiązaniu przez konstrukty, takie jak Styl. W takim przypadku to, co faktycznie chcesz powiązać, to element, do którego styl jest stosowany. W tym przypadku RelativeSource Self da ci ten element, w którym "to" po prostu da ci instancję Style.

+1

To było jedyne, co mogłem wymyślić lub znaleźć. Wpadłem na wiele innych pytań na temat: WPF, w której brakowało mi informacji, więc chciałem sprawdzić, czy ktoś inny coś na ten temat ma. Dzięki, Jared. :) –

-1

Dlaczego sądzisz, że istnieje między nimi różnica? Myślę, że powinny być identyczne, ponieważ są to dwa sposoby odniesienia się do tego samego elementu.

+0

"Myślę, że" i "powinien" nie stanowi odpowiedzi. Rozważ ocenę, w jaki sposób każda metoda rozwiązuje cel i scenariusze, które mogą powodować różnice. Zobacz odpowiedź JaredPar. – Gusdor

2

Jeśli często zmieniasz nazwy swoich kontrolek, to używanie formularza samo-odświeżającego może być bardziej pożądane, inaczej powiedziałbym, że jest to połączenie, które zrobiłbym na podstawie wydajności. Zbuduj mały test i zobacz, który typ wiązania działa lepiej i wybierz ten. Jeśli różnica w wydajności jest znikoma, to z pewnością wziąłbym pod uwagę inne kwestie związane z konserwacją, takie jak ogólny wygląd i czas pisania. Nie zapominaj również, że przy korzystaniu z samo-referencyjnej formy nie musisz nazywać swojego elementu, więc musisz uwzględnić ten dodatkowy wymóg nazewnictwa dla formularza ElementName, porównując ile pisania i kontekstowego przełączania między myszą a klawiaturą.

Osobiście wolę referencyjne formy wiążące, gdy ma to sens w celu ułatwienia refaktoryzacji oraz faktu, że nie muszę poruszać się po dokumencie XAML, aby dodać nazwę elementu podczas konfigurowania wiązania.