2010-05-11 8 views
10

(szczerze szukałem i przeczytałem wszystkie "powiązane pytania", które wydawały się istotne - mam nadzieję, że nie "tęskniłem" za tym pytaniem z innych miejsc, ale tutaj idzie ...)Gdzie należy ustawić DataContext - kod za lub xaml?

Istnieją dwa różne sposoby (w najmniej), aby ustawić DataContext. Można użyć XAML lub można użyć kodu z tyłu.

Co to jest "najlepsza praktyka" i dlaczego?

Preferuję ustawienie go w XAML, ponieważ pozwala projektantowi definiować kolekcje na własną rękę, ale potrzebuję "amunicji" na to, dlaczego jest to najlepsza praktyka lub dlaczego jestem szalona, ​​a kod z tyłu jest bombą ..

Odpowiedz

2

Myślę, że to zależy od tego, do czego ustawiasz DataContext, a ostatecznie od osobistych preferencji.

Ja osobiście zawsze robię to pod kodem moich widoków, ponieważ uważam, że jest ogólnie czystszy, i właśnie tak zostałem nauczony MVVM. Inną rzeczą, o której trzeba pamiętać, jest to, że czasami trzeba zmienić format danych w zależności od tego, z czym pracujesz. Jeśli tak jest, to jest znacznie czystsze/łatwiejsze do wykonania w kodzie, niż w XAML.

0

Kontekst danych sterowania użytkownika/widok Zakładam? Jedną z zalet ustawienia kontekstu danych w kodzie źródłowym jest dostępność iniekcji zależności. Twój pojemnik DI może zająć się zależnością dla ciebie dynamicznie w czasie działania.

Przy użyciu tego wzorca często ustawi się DataContext widoku projektu Blend w Xaml przy użyciu d: DataContext. "Wersja projektu" może dostarczyć fałszywych danych do użycia w Blend, podczas gdy prawdziwa implementacja jest rozwiązywana w czasie wykonywania.

+0

na pewno tego rodzaju rzeczy szukam ... Osobiście wolę ustawić go w Xaml. dla mnie ustawienie go w kodzie z tyłu staje się trudne, ponieważ * można * ustawić datacontext "gdziekolwiek", więc czasami śledzenie "gdzie" jest bólem ... to jest bardziej zgodne z typem "powodów do korzystania w jedną stronę lub inny "szukam ...(w tym przypadku "wyśmiewane dane" w mieszance są "powodem") – dovholuk

4

Trzeci sposób, w jaki można na to patrzeć, to korzystanie z usługi lokalizatora. Zazwyczaj mam jedną klasę, która jest odpowiedzialna za tworzenie całego mojego DataContext (VM w większości przypadków dla mnie) i tworzę instancję tej klasy w zasobach App.xaml. Następnie wiążę DataContext w XAML każdej pojedynczej strony.

tj

<Page DataContext="{Binding ViewModel,Source={StaticResource Locator}}" > 
1

Jak widać za odpowiedzi tak daleko opinia jest podzielona. Prawdę mówiąc, nie ma najlepszej praktyki (łapię się na tym, że mówię o "najlepszej praktyce" w świecie Silverlight, zbyt młodym, aby najlepsza praktyka była prawdziwie znana.)

Rzeczywistość jest taka, że nie można ustawić "kontekstu danych" w Xaml. Chyba, że ​​faktycznie skonstruować instancję obiektu tak: -

<UserControl> 
    <UserControl.DataContext> 
    <local:MyDataProviderThing /> 

Ostatecznie czymś zewnętrznym musi przypisać albo właściwość DataContext bezpośrednio lub pośrednio za pomocą innego mienia lub poprzez wiązanie (jak w odpowiedzi Szczepana). Jego zewnętrzny kontekst określa, czy ma to sens w Xaml czy nie. Wiele rozwiązań MVVM wykorzystuje powiązanie w Xaml, w niektórych przypadkach po prostu po to, aby uniknąć jakiegokolwiek kodu w kodzie z tyłu, zamiast naprawdę być "lepszym". Inne konfigurują DataContext w kodzie przy użyciu klasy bazowej, z której pochodzi sterowanie.

+0

Jestem confued - post Stephana wyraźnie pokazuje (no dobrze, tak czy inaczej), jak ustawić datacontext przez Xaml, więc możesz wyjaśnić, co masz na myśli mówiąc nie możesz ustawić datacontext w xaml proszę? dzięki – dovholuk

+1

@dovholuk: Zwróć uwagę na moje użycie kontekstu danych "in" "Tak, możesz przypisać obiekt do właściwości' DataContext' w Xaml, ale odpowiedź Stephana pokazuje, że to, co faktycznie jest przypisane, to 'Wiązanie'. nie jest prawdziwym "kontekstem danych" Rzeczywisty obiekt przypisany do "kontekstu danych" jest wykonywany w kodzie w właściwości 'ViewModel' obiektu przypisanego do statycznego zasobu o nazwie' Locator'. – AnthonyWJones

Powiązane problemy