Jakie są różne tryby powiązań WPF?

86

Nie rozumiem różnych trybów powiązań danych w WPF, takich jak:

  • Jednokierunkowa
  • Dwukierunkowy
  • Jeden raz
  • itp...

Co oznacza każdy z tych trybów?

Kiedy należy ich używać?

DATT OZA
źródło

Odpowiedzi:

159
  • OneWay: Użyj tego, jeśli chcesz, aby powiązana właściwość aktualizowała interfejs użytkownika.
  • TwoWay: Zachowuje się tak samo jak OneWayi OneWayToSourcepołączone. Powiązana właściwość zaktualizuje interfejs użytkownika, a zmiany w interfejsie użytkownika zaktualizują powiązaną właściwość (należy jej użyć na przykład z a TextBoxlub a Checkbox).
  • OneTime: Zachowuje się tak samo, jak OneWayz tym wyjątkiem, że aktualizuje interfejs użytkownika tylko raz. Powinien to być twój domyślny wybór dla wiązania (z różnych powodów, których nie będę tu omawiać), powinieneś używać innych typów powiązań tylko wtedy, gdy faktycznie potrzebujesz dodatkowej funkcjonalności.
  • OneWayToSource: Jest to przeciwieństwo OneWay- zmiany wartości interfejsu użytkownika aktualizują powiązaną właściwość.

Jeśli nic nie określisz, zachowanie będzie zależało od używanego formantu.

Aby uzyskać więcej informacji, zobacz BindingModewyliczenie w witrynie MSDN .

Dave
źródło
Dzięki. to jest pomocne ... Ale proszę podać przykład TwoWay ... Chcę wiedzieć, jak to odzwierciedla kod związany z.
DATT OZA
2
@DATT: co rozumiesz przez „określić”? Zasadniczo, jeśli ustawisz Mode = TwoWay w XAML, po zmianie wartości GUI automatycznie zaktualizuje C # właściwość. Jednak Twoja właściwość w kodzie musi zostać zaimplementowana w klasie (takiej jak ViewModel), która implementuje interfejs INotifyPropertyChanged. Gdy związany z kodem zmienia wartość właściwości za pośrednictwem set, należy wywołać PropertyChanged, aby interfejs GUI został powiadomiony o zmianie wartości i zaktualizował się automatycznie.
Dave,
1
Jeśli nic nie określisz, zachowanie będzie zależało od WŁASNOŚCI, której używasz.
Mauro Sampietro
37

Wiązanie składa się z dwóch podmiotów:

  1. Źródło (zazwyczaj ViewModel w scenariuszach MVVM)
  2. Cel (kontrolka interfejsu użytkownika)

Celem musi być DependencyObject(aby powiązanie działało), a źródło może być a DependencyObjectlub powinno mieć jakiś mechanizm imitujący system powiązań WPF o zmianie ( INotifyPropetyChnagedinterfejs Implemeting ).


MVVM zaleca, aby projekt ViewModel był wolny od wszelkich odwołań związanych z widokiem, dlatego zaleca się użycie INotifyPropertyChangedinterfejsu, aby obiekt Source był słyszalny przez powiązanie WPF. Wiązanie zachodzi między właściwością źródła a właściwością celu (musi być a DependencyProperty). Przykłady TextPropertyz TextBoxklasy jest z danymi do (powiedzmy) UserNamewłaściwości modelu widoku. Powiązanie WPF oferuje cztery typy powiązań. Pamiętaj, że powiązanie działa w wątku interfejsu użytkownika, chyba że określisz inaczej, aby działał inaczej.

  1. OneWay : Właściwość target nasłuchuje zmienianej właściwości źródłowej i sama się aktualizuje. Jeśli programowo zmienisz właściwość ViewwModel UserName, zostanie to odzwierciedlone w polu tekstowym. Jest to koszt pośredni, ponieważ system wiążący obserwuje tylko źródło zmian.
  2. TwoWay : Właściwość docelowa nasłuchuje zmienianej właściwości źródłowej i sama się aktualizuje. AND Właściwość źródłowa nasłuchuje zmienianej właściwości docelowej i sama się aktualizuje. Zarówno właściwość, jak TextPropertyi UserNamewłaściwość pozostaną zsynchronizowane i będą się wzajemnie aktualizować, jeśli jedna ulegnie zmianie. Jest to najbardziej kosztowne, ponieważ system wiązań musi obserwować obie strony pod kątem zmian.
  3. OneWayToSource : Właściwość Source ulegnie zmianie, jeśli właściwość docelowa zostanie zmieniona. Jeśli użytkownik zmieni wartość TextProperty, UserNamewłaściwość przyjmie zmienioną wartość. Ponownie jest to koszt pośredni, ponieważ system wiążący obserwuje tylko cel zmian.
  4. OneTime : dzieje się to tylko raz w okresie istnienia Binding, właściwość Target zostanie zaktualizowana za pomocą właściwości Source, gdy nastąpi Binding. Jest to najmniej kosztowne i jest zalecane w scenariuszach, w których mają być wyświetlane dane statyczne Label, np. TextBlockItp.

Jeśli nic nie wymienisz, każda właściwość docelowa ma skojarzony ze sobą domyślny tryb powiązania. Np. TextPropertyA TextBoxma domyślny tryb wiązania jako TwoWay. Dla TextPropertyz a TextBlockto jest jedna droga.

Wskazane jest, aby wybrać odpowiedni tryb, ponieważ może on pomóc w zmniejszeniu opóźnienia aplikacji, szczególnie w przypadkach, gdy masz dużą liczbę kontrolek w interfejsie użytkownika.

Więcej informacji na temat MVVM tutaj jest artykuł napisany przeze mnie.

James
źródło