Dela via


Vad är bindningskällor?

I databindningen refererar det bindande källobjektet till det objekt som du hämtar data från. I den här artikeln beskrivs de typer av objekt som du kan använda som bindningskälla, till exempel .NET CLR-objekt, XML och DependencyObject objekt.

Bindning av källtyper

Databindningen för Windows Presentation Foundation (WPF) stöder följande typer av bindningskällor:

Implementera en bindningskälla för dina objekt

Dina CLR-objekt kan bli bindningskällor. Det finns några saker att tänka på när du implementerar en klass för att fungera som en bindningskälla.

Ange ändringsmeddelanden

Om du använder antingen OneWay eller TwoWay bindning, implementera en lämplig meddelandemekanism för "egenskapsändring". Den rekommenderade mekanismen är att CLR-klassen eller den dynamiska klassen implementerar INotifyPropertyChanged gränssnittet. Mer information finns i How to: Implement Property Change Notification (.NET Framework).

Det finns två sätt att meddela en prenumerant om en egenskapsändring:

  • Implementera INotifyPropertyChanged-gränssnittet.

    Det här är den rekommenderade mekanismen för meddelanden. INotifyPropertyChanged levererar händelsen PropertyChanged, som det bindande systemet respekterar. Genom att skapa den här händelsen och ange namnet på den egenskap som ändrades meddelar du ett bindande mål för ändringen.

  • Implementera PropertyChanged-mönstret.

    Varje egenskap som behöver meddela ett bindningsmål att det har ändrats, har en motsvarande PropertyNameChanged händelse, där PropertyName är namnet på egenskapen. Du genererar händelsen varje gång egenskapen ändras.

Om bindningskällan implementerar någon av dessa meddelandemekanismer sker måluppdateringar automatiskt. Om bindningskällan av någon anledning inte ger korrekta meddelanden om egenskapsändringar kan du använda UpdateTarget-metoden för att uppdatera målegenskapen explicit.

Andra egenskaper

Följande lista innehåller andra viktiga punkter att notera:

  • Dataobjekt som fungerar som bindningskällor kan deklareras i XAML som resurser, förutsatt att de har en parameterlös konstruktor. Annars måste du skapa dataobjektet i koden och direkt tilldela det till antingen datakontexten för ditt XAML-objektträd eller som bindningskälla för bindning.

  • De egenskaper som du använder som bindningskällegenskaper måste vara publika egenskaper för din klass. Explicit definierade gränssnittsegenskaper kan inte nås i bindningssyfte, och inte heller skyddade, privata, interna eller virtuella egenskaper utan baskodimplementering.

  • Du kan inte binda till publika fält.

  • Typen av egenskapen som deklareras i klassen är den typ som skickas till bindningen. Vilken typ som slutligen används av bindningen beror dock på typen av bindningsmålegenskap, inte på bindningskällans egenskap. Om det finns en skillnad i typ kanske du vill skriva en konverterare för att hantera på vilket sätt din anpassade egenskap ursprungligen överförs till bindningen. Mer information finns i IValueConverter.

Hela objekt som bindningskälla

Du kan använda ett helt objekt som bindningskälla. Ange bindningskällan med Source- eller DataContext-egenskapen, och ange sedan en tom bindningsdeklaration: {Binding}. Scenarier där detta är användbart är bindning till objekt som är av typen sträng, bindning till objekt med flera egenskaper som du är intresserad av eller bindning till samlingsobjekt. Ett exempel på hur man binder till ett helt samlingsobjekt kan ses i How to Use the Master-Detail Pattern with Hierarchical Data (.NET Framework).

Du kan behöva tillämpa anpassad logik så att data är meningsfull för din bundna målparameter. Den anpassade logiken kan vara i form av en anpassad konverterare eller en DataTemplate. Mer information om konverterare finns i Datakonvertering. Mer information om datamallar finns i Översikt över datamallning (.NET Framework).

Samlingsobjekt som bindningskälla

Ofta är det objekt som du vill använda som bindningskälla en samling anpassade objekt. Varje objekt fungerar som källa för en instans av en upprepad bindning. Du kan till exempel ha en CustomerOrders samling som består av CustomerOrder objekt, där ditt program itererar över samlingen för att avgöra hur många beställningar som finns och vilka data som finns i varje ordning.

Du kan räkna upp alla samlingar som implementerar IEnumerable-gränssnittet. Men för att konfigurera dynamiska bindningar så att infogningar eller borttagningar i samlingen uppdaterar användargränssnittet automatiskt måste samlingen implementera INotifyCollectionChanged-gränssnittet. Det här gränssnittet exponerar en händelse som måste aktiveras när den underliggande samlingen ändras.

Klassen ObservableCollection<T> är en inbyggd implementering av en datainsamling som exponerar INotifyCollectionChanged gränssnittet. De enskilda dataobjekten i samlingen måste uppfylla de krav som beskrivs i föregående avsnitt. Ett exempel finns i How to Create and Bind to an ObservableCollection (.NET Framework). Innan du implementerar din egen samling bör du överväga att använda ObservableCollection<T> eller någon av de befintliga samlingsklasserna, till exempel List<T>, Collection<T>och BindingList<T>, bland många andra.

När du anger en samling som en bindningskälla binder WPF inte direkt till samlingen. I stället binder WPF faktiskt till samlingens standardvy. Information om standardvyer finns i Använda en standardvy.

Om du har ett avancerat scenario och vill implementera din egen samling bör du överväga att använda IList gränssnittet. Det här gränssnittet innehåller en icke-allmän samling objekt som kan nås individuellt av index, vilket kan förbättra prestandan.

Behörighetskrav i databindning

Till skillnad från .NET Framework körs .NET med fullständig säkerhet. Alla databindningar körs med samma åtkomst som användaren som kör programmet.

Se även