Przegląd Wiązanie źródeł

W powiązaniu danych obiekt źródłowy powiązania odwołuje się do obiektu, z którego uzyskujesz dane. W tym temacie omówiono typy obiektów, których można użyć jako źródła powiązania.

Powiązania typów źródeł

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

Źródło powiązania opis
obiekty środowiska uruchomieniowego języka wspólnego (CLR) Można powiązać z właściwościami publicznymi, właściwościami podrzędnych, a także indeksatorami dowolnego obiektu środowiska uruchomieniowego języka wspólnego (CLR). Aparat powiązania używa odbicia CLR, aby uzyskać wartości właściwości. Alternatywnie obiekty implementujące ICustomTypeDescriptor lub zarejestrowane TypeDescriptionProvider również współpracują z aparatem powiązania.

Aby uzyskać więcej informacji na temat implementowania klasy, która może służyć jako źródło powiązania, zobacz Implementowanie klasy dla źródła powiązania w dalszej części tego tematu.
obiekty dynamiczne Można powiązać z dostępnymi właściwościami i indeksatorami obiektu, który implementuje IDynamicMetaObjectProvider interfejs. Jeśli możesz uzyskać dostęp do elementu członkowskiego w kodzie, możesz go powiązać. Jeśli na przykład obiekt dynamiczny umożliwia dostęp do elementu członkowskiego w kodzie za pośrednictwem someObject.APropertymetody , możesz powiązać go, ustawiając ścieżkę powiązania na AProperty.
obiekty ADO.NET Można powiązać z obiektami ADO.NET, takimi jak DataTable. DataView ADO.NET implementuje IBindingList interfejs, który udostępnia powiadomienia o zmianie, na których nasłuchuje aparat powiązania.
Obiekty XML Możesz powiązać i uruchomić XPath zapytania w obiekcie XmlNode, XmlDocumentlub XmlElement. Wygodnym sposobem uzyskiwania dostępu do danych XML, które jest źródłem powiązania w adiustacji, jest użycie XmlDataProvider obiektu. Aby uzyskać więcej informacji, zobacz Bind to XML Data Using an XMLDataProvider and XPath Queries (Wiązanie z danymi XML przy użyciu elementu XMLDataProvider i zapytań XPath).

Można również powiązać element z elementem XElement lub XDocumentlub powiązać z wynikami zapytań uruchamianych na obiektach tych typów przy użyciu linQ to XML. Wygodnym sposobem używania LINQ to XML do uzyskiwania dostępu do danych XML, które jest źródłem powiązania w adiustacji, jest użycie ObjectDataProvider obiektu. Aby uzyskać więcej informacji, zobacz Bind to XDocument, XElement lub LINQ for XML Query Results (Powiązanie z elementem XDocument, XElement lub LINQ dla wyników zapytania XML).
DependencyObject Obiektów Można powiązać z właściwościami zależności dowolnego DependencyObjectelementu . Aby zapoznać się z przykładem, zobacz Wiązanie właściwości dwóch kontrolek.

Implementowanie klasy dla źródła powiązania

Możesz utworzyć własne źródła powiązań. W tej sekcji omówiono zagadnienia, które należy wiedzieć, czy implementujesz klasę, która będzie służyć jako źródło powiązania.

Dostarczanie powiadomień o zmianie

Jeśli używasz OneWay powiązania lub TwoWay (ponieważ interfejs użytkownika ma zostać zaktualizowany, gdy właściwości źródła powiązania zmieniają się dynamicznie), musisz zaimplementować 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 Implement Property Change Notification (Implementowanie powiadomienia o zmianie właściwości).

Jeśli tworzysz obiekt CLR, który nie implementuje INotifyPropertyChangedelementu , musisz zorganizować własny system powiadomień, aby upewnić się, że dane używane w powiązaniu pozostaną aktualne. Powiadomienia o zmianie można podać, obsługując PropertyChanged wzorzec dla każdej właściwości, dla której chcesz zmienić powiadomienia. Aby obsługiwać ten wzorzec, należy zdefiniować zdarzenie PropertyNameChanged dla każdej właściwości, 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 dostarcza odpowiednich powiadomień o zmianie właściwości, możesz jawnie zaktualizować właściwość docelową za pomocą UpdateTarget metody .

Inne cechy

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

  • Jeśli chcesz utworzyć obiekt w języku XAML, klasa musi mieć konstruktor bez parametrów. W niektórych językach platformy .NET, takich jak C#, konstruktor bez parametrów może zostać utworzony.

  • Właściwości używane jako właściwości źródła powiązania dla 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.

Używanie całych obiektów jako źródła powiązania

Można użyć całego obiektu jako źródła powiązania. Źródło powiązania można określić przy użyciu Source właściwości lub DataContext , a następnie podać pustą deklarację powiązania: {Binding}. Scenariusze, w których jest to przydatne, obejmują powiązanie z obiektami typu, powiązanie z obiektami z wieloma interesującymi Cię właściwościami lub powiązanie z obiektami kolekcji. Aby zapoznać się z przykładem powiązania z całym obiektem kolekcji, zobacz Use the Master-Detail Pattern with Hierarchical Data (Używanie wzorca szczegółów wzorca z danymi hierarchicznymi).

Należy pamiętać, że 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 (jeśli domyślna konwersja typu nie istnieje) lub DataTemplate. Aby uzyskać więcej informacji na temat konwerterów, zobacz sekcję Konwersja danych w temacie Omówienie powiązania danych. Aby uzyskać więcej informacji na temat szablonów danych, zobacz Omówienie tworzenia szablonów danych.

Używanie obiektów kolekcji jako źródła 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órej aplikacja iteruje w kolekcji, aby określić liczbę zamówień i dane zawarte w każdej z nich.

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 Create and Bind to an ObservableCollection (Tworzenie i wiązanie z obiektem ObservableCollection). Przed wdrożeniem własnej kolekcji rozważ użycie ObservableCollection<T> lub jednej z istniejących klas kolekcji, takich jak, między innymi, List<T>, Collection<T> i BindingList<T>.

WPF nigdy nie wiąże się bezpośrednio z kolekcją. Jeśli określisz kolekcję jako źródło powiązania, WPF faktycznie wiąże się z domyślnym widokiem kolekcji. Aby uzyskać informacje o widokach domyślnych, zobacz Omówienie powiązania danych.

Jeśli masz zaawansowany scenariusz i chcesz zaimplementować własną kolekcję, rozważ użycie interfejsu IList . IList 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 przypadku powiązania danych należy wziąć pod uwagę poziom zaufania aplikacji. W poniższej tabeli przedstawiono podsumowanie typów właściwości, które mogą być powiązane z aplikacją, która jest uruchamiana w trybie pełnego zaufania lub częściowego zaufania:

Typ właściwości

(wszystkie modyfikatory dostępu)
Właściwość obiektu dynamicznego Właściwość obiektu dynamicznego Właściwość CLR Właściwość CLR Właściwość zależności Właściwość zależności
Poziom zaufania Pełne zaufanie Częściowe zaufanie Pełne zaufanie Częściowe zaufanie Pełne zaufanie Częściowe zaufanie
Klasa publiczna Tak Tak Tak Tak Tak Tak
Klasa niepublijna Tak Brak Tak Brak Tak Tak

W tej tabeli opisano następujące ważne kwestie dotyczące wymagań dotyczących uprawnień w powiązaniu danych:

  • W przypadku właściwości CLR powiązanie danych działa tak długo, jak aparat powiązania może uzyskać dostęp do właściwości źródłowej powiązania przy użyciu odbicia. W przeciwnym razie aparat powiązania wyświetla ostrzeżenie, że nie można odnaleźć właściwości i używa wartości rezerwowej lub wartości domyślnej, jeśli jest dostępna.

  • Można powiązać z właściwościami obiektów dynamicznych zdefiniowanych w czasie kompilacji lub czasie wykonywania.

  • Zawsze można powiązać z właściwościami zależności.

Wymaganie uprawnień dla powiązania XML jest podobne. W piaskownicy z częściowym zaufaniem kończy się niepowodzeniem, XmlDataProvider gdy nie ma uprawnień dostępu do określonych danych.

Obiekty z typem anonimowym są wewnętrzne. Można powiązać z właściwościami typów anonimowych tylko wtedy, gdy działa w pełnym zaufaniu. Aby uzyskać więcej informacji na temat typów anonimowych, zobacz Typy anonimowe (Przewodnik programowania w języku C#) lub Typy anonimowe (Visual Basic) (Visual Basic).

Aby uzyskać więcej informacji na temat zabezpieczeń częściowych zaufania, zobacz Zabezpieczenia częściowego zaufania WPF.

Zobacz też