Gewusst wie: Implementieren von PriorityBinding
Aktualisiert: November 2007
PriorityBinding in Windows Presentation Foundation (WPF) funktioniert durch Angabe einer Liste von Bindungen. Die folgende Liste der Bindungen ist absteigend nach Priorität geordnet. Wenn die Bindung mit der höchsten Priorität erfolgreich einen Wert zurückgibt, wenn sie verarbeitet wird, dann müssen die anderen Bindungen in der Liste nicht mehr verarbeitet werden. Möglicherweise nimmt die Auswertung der Bindung mit der höchsten Priorität einige Zeit in Anspruch. Es wird so lange die Bindung mit der nächsten Priorität, die erfolgreich einen Wert zurückgibt, verwendet, bis eine Bindung mit einer höheren Priorität einen Wert erfolgreich zurückgibt.
Beispiel
Um die Funktionsweise von PriorityBinding zu veranschaulichen, wurde das AsyncDataSource-Objekt mit den folgenden drei Eigenschaften erstellt: FastDP, SlowerDP und SlowestDP.
Der get-Accessor von FastDP gibt den Wert des _fastDP-Datenmembers zurück.
Der get-Accessor von SlowerDP wartet 3 Sekunden, bevor der Wert des _slowerDP-Datenmembers zurückgegeben wird.
Der get-Accessor von SlowestDP wartet 5 Sekunden, bevor der Wert des _slowestDP-Datenmembers zurückgegeben wird.
Tipp
Dieses Beispiel dient nur der Veranschaulichung. In den Microsoft .NET-Richtlinien wird die Definition von Eigenschaften, die erheblich langsamer als ein Satz von Feldern sind, nicht empfohlen. Weitere Informationen finden Sie unter Auswählen zwischen Eigenschaften und Methoden.
Public Class AsyncDataSource
' Properties
Public Property FastDP As String
Get
Return Me._fastDP
End Get
Set(ByVal value As String)
Me._fastDP = value
End Set
End Property
Public Property SlowerDP As String
Get
Thread.Sleep(3000)
Return Me._slowerDP
End Get
Set(ByVal value As String)
Me._slowerDP = value
End Set
End Property
Public Property SlowestDP As String
Get
Thread.Sleep(5000)
Return Me._slowestDP
End Get
Set(ByVal value As String)
Me._slowestDP = value
End Set
End Property
' Fields
Private _fastDP As String
Private _slowerDP As String
Private _slowestDP As String
End Class
public class AsyncDataSource
{
private string _fastDP;
private string _slowerDP;
private string _slowestDP;
public AsyncDataSource()
{
}
public string FastDP
{
get { return _fastDP; }
set { _fastDP = value; }
}
public string SlowerDP
{
get
{
// This simulates a lengthy time before the
// data being bound to is actualy available.
Thread.Sleep(3000);
return _slowerDP;
}
set { _slowerDP = value; }
}
public string SlowestDP
{
get
{
// This simulates a lengthy time before the
// data being bound to is actualy available.
Thread.Sleep(5000);
return _slowestDP;
}
set { _slowestDP = value; }
}
}
Die Text-Eigenschaft wird mit PriorityBinding an den oben erwähnten AsyncDS gebunden:
<Window.Resources>
<c:AsyncDataSource SlowestDP="Slowest Value" SlowerDP="Slower Value"
FastDP="Fast Value" x:Key="AsyncDS" />
</Window.Resources>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"
DataContext="{Binding Source={StaticResource AsyncDS}}">
<TextBlock FontSize="18" FontWeight="Bold" Margin="10"
HorizontalAlignment="Center">Priority Binding</TextBlock>
<TextBlock Background="Honeydew" Width="100" HorizontalAlignment="Center">
<TextBlock.Text>
<PriorityBinding FallbackValue="defaultvalue">
<Binding Path="SlowestDP" IsAsync="True"/>
<Binding Path="SlowerDP" IsAsync="True"/>
<Binding Path="FastDP" />
</PriorityBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
Wenn das Bindungsmodul die Binding-Objekte verarbeitet, wird zunächst das erste Binding-Element verarbeitet, das an die SlowestDP-Eigenschaft gebunden ist. Wenn dieses Binding-Element verarbeitet wurde, gibt es keinen Wert erfolgreich zurück, da es 5 Sekunden deaktiviert ist. Deshalb wird das nächste Binding-Element verarbeitet. Das nächste Binding-Element gibt keinen Wert erfolgreich zurück, da es 3 Sekunden aktiviert ist. Das Bindungsmodul fährt mit dem nächsten Binding-Element fort, das an die FastDP-Eigenschaft gebunden ist. Dieses Binding-Element gibt den Wert "Fast Value" zurück. Der TextBlock zeigt jetzt den Wert "Fast Value" an.
Nach 3 Sekunden gibt die SlowerDP-Eigenschaft den Wert "Slower Value" zurück. Der TextBlock zeigt dann den Wert "Slower Value" an.
Nach 5 Sekunden gibt die SlowestDP-Eigenschaft den Wert "Slowest Value" zurück. Diese Bindung hat die höchste Priorität, weil sie zuerst in der Liste angezeigt wird. Der TextBlock zeigt jetzt den Wert "Slowest Value" an.
Weitere Informationen über erfolgreiche Rückgabewerte von einer Bindung finden Sie unter PriorityBinding.
Das vollständige Beispiel finden Sie unter Beispiel für das Binden mit PriorityBinding.