Omówienie źródeł powiązań (WPF .NET)

W powiązaniu danych obiekt źródłowy powiązania odwołuje się do obiektu, z którego uzyskujesz dane. W tym artykule omówiono typy obiektów, których można użyć jako źródła powiązania, takich jak obiekty CLR platformy .NET, XML i DependencyObject obiekty.

Wiązanie typów źródeł

Powiązanie danych programu Windows Presentation Foundation (WPF) obsługuje następujące typy źródeł powiązań:

Implementowanie źródła powiązania na obiektach

Obiekty CLR mogą stać się źródłami powiązań. Istnieje kilka kwestii, o których należy pamiętać podczas implementowania klasy, która będzie służyć jako źródło powiązania.

Podaj powiadomienia o zmianie

Jeśli używasz powiązania OneWay lub TwoWay , zaimplementuj odpowiedni mechanizm powiadamiania o zmianie właściwości. Zalecanym mechanizmem jest implementacja interfejsu przez clR lub klasę dynamiczną INotifyPropertyChanged . Aby uzyskać więcej informacji, zobacz How to: Implement Property Change Notification (.NET Framework).

Istnieją dwa sposoby powiadamiania subskrybenta o zmianie właściwości:

  1. Zaimplementuj interfejs INotifyPropertyChanged.

    Jest to zalecany mechanizm powiadomień. PropertyChanged Dostarcza INotifyPropertyChanged zdarzenie, które jest zgodne z systemem powiązań. Podnosząc to zdarzenie i podając nazwę zmienionej właściwości, powiadomisz element docelowy powiązania zmiany.

  2. Zaimplementuj PropertyChanged wzorzec.

    Każda właściwość, która musi powiadomić obiekt docelowy powiązania o jego zmianie, ma odpowiednie PropertyNameChanged zdarzenie, gdzie PropertyName jest nazwą właściwości. Zdarzenie jest wywoływane za każdym razem, gdy zmienia się właściwość.

Jeśli źródło powiązania implementuje jeden z tych mechanizmów powiadomień, aktualizacje docelowe są wykonywane automatycznie. Jeśli z jakiegokolwiek powodu źródło powiązania nie udostępnia odpowiednich powiadomień o zmianie właściwości, możesz użyć UpdateTarget metody , aby jawnie zaktualizować właściwość docelową.

Inne cechy

Poniższa lista zawiera inne ważne kwestie do zapamiętania:

  • Obiekty danych, które służą jako źródła powiązań, mogą być deklarowane w języku XAML jako zasoby, pod warunkiem że mają konstruktor bez parametrów. W przeciwnym razie należy utworzyć obiekt danych w kodzie i przypisać go bezpośrednio do kontekstu danych drzewa obiektów XAML lub jako źródło powiązania powiązania.

  • Właściwości używane jako właściwości źródła powiązania muszą być właściwościami publicznymi klasy. Jawnie zdefiniowane właściwości interfejsu nie mogą być dostępne do celów powiązania ani nie mogą być chronione, prywatne, wewnętrzne lub wirtualne właściwości, które nie mają implementacji podstawowej.

  • Nie można powiązać z polami publicznymi.

  • Typ właściwości zadeklarowanej w klasie jest typem przekazywanym do powiązania. Jednak typ ostatecznie używany przez powiązanie zależy od typu właściwości docelowej powiązania, a nie właściwości źródłowej powiązania. Jeśli istnieje różnica w typie, możesz napisać konwerter, aby obsłużyć sposób, w jaki właściwość niestandardowa jest początkowo przekazywana do powiązania. W celu uzyskania więcej informacji, zobacz następujący temat: IValueConverter.

Całe obiekty jako źródło powiązania

Można użyć całego obiektu jako źródła powiązania. Określ źródło powiązania przy użyciu Source właściwości lub DataContext , a następnie podaj pustą deklarację powiązania: {Binding}. Scenariusze, w których jest to przydatne, obejmują powiązanie z obiektami, które są ciągiem typu, powiązaniem z obiektami z wieloma właściwościami, które cię interesują, lub powiązaniem z obiektami kolekcji. Przykład powiązania z całym obiektem kolekcji można znaleźć w temacie How to Use the Master-Detail Pattern with Hierarchical Data (.NET Framework) (Jak używać wzorca master-detail z danymi hierarchicznymi (.NET Framework).

Może być konieczne zastosowanie logiki niestandardowej, aby dane miały znaczenie dla powiązanej właściwości docelowej. Logika niestandardowa może być w postaci konwertera niestandardowego lub DataTemplate. Aby uzyskać więcej informacji na temat konwerterów, zobacz Konwersja danych. Aby uzyskać więcej informacji na temat szablonów danych, zobacz Omówienie szablonów danych (.NET Framework).

Obiekty kolekcji jako źródło powiązania

Często obiekt, którego chcesz użyć jako źródło powiązania, jest kolekcją obiektów niestandardowych. Każdy obiekt służy jako źródło dla jednego wystąpienia powtarzającego się powiązania. Na przykład może istnieć CustomerOrders kolekcja składająca się z CustomerOrder obiektów, w których aplikacja iteruje w kolekcji, aby określić liczbę zamówień i dane zawarte w poszczególnych zamówieniach.

Możesz wyliczyć dowolną kolekcję, która implementuje interfejs IEnumerable. Aby jednak skonfigurować powiązania dynamiczne tak, aby wstawienie lub usunięcie w kolekcji automatycznie zaktualizowało interfejs użytkownika, kolekcja musi zaimplementować interfejs INotifyCollectionChanged. Ten interfejs uwidacznia zdarzenie, które należy zgłaszać za każdym razem, gdy podstawowa kolekcja ulegnie zmianie.

Klasa ObservableCollection<T> to wbudowana implementacja kolekcji danych, która uwidacznia INotifyCollectionChanged interfejs. Poszczególne obiekty danych w kolekcji muszą spełniać wymagania opisane w poprzednich sekcjach. Aby zapoznać się z przykładem, zobacz How to Create and Bind to an ObservableCollection (.NET Framework) (Jak utworzyć i powiązać z obiektem ObservableCollection (.NET Framework). Przed wdrożeniem własnej kolekcji rozważ użycie ObservableCollection<T> lub jedną z istniejących klas kolekcji, takich jak List<T>, Collection<T>i BindingList<T>, między innymi.

Po określeniu kolekcji jako źródła powiązania platforma WPF nie wiąże się bezpośrednio z kolekcją. Zamiast tego WPF faktycznie wiąże się z domyślnym widokiem kolekcji. Aby uzyskać informacje o widokach domyślnych, zobacz Używanie widoku domyślnego.

Jeśli masz zaawansowany scenariusz i chcesz zaimplementować własną kolekcję, rozważ użycie interfejsu IList . Ten interfejs udostępnia niegeneryjną kolekcję obiektów, do których można uzyskać dostęp indywidualnie według indeksu, co może poprawić wydajność.

Wymagania dotyczące uprawnień w powiązaniu danych

W przeciwieństwie do programu .NET Framework platforma .NET działa z zabezpieczeniami o pełnym zaufaniu. Wszystkie powiązania danych są uruchamiane z tym samym dostępem co użytkownik, na którym jest uruchomiona aplikacja.

Zobacz też