Gewusst wie: Implementieren von PriorityBinding
PriorityBinding in Windows Presentation Foundation (WPF) funktioniert durch Angabe einer Liste von Bindungen. Die Liste der Bindungen ist von der höchsten zur niedrigsten Priorität sortiert. Wenn die Bindung mit der höchsten Priorität bei ihrer Verarbeitung erfolgreich einen Wert zurückgibt, müssen die anderen Bindungen in der Liste grundsätzlich nicht verarbeitet werden. Es kann vorkommen, dass die Auswertung der Bindung mit der höchsten Priorität lange dauert. Dann wird die Bindung mit der nächsthöheren Priorität, die einen Wert erfolgreich zurückgibt, so lange verwendet, bis eine Bindung mit einer höheren Priorität einen Wert erfolgreich zurückgibt.
Beispiel
Um zu demonstrieren, wie PriorityBinding funktioniert, 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.
Hinweis
Dieses Beispiel dient ausschließlich Demonstrationszwecken. In den .NET-Leitlinien wird davon abgeraten, Eigenschaften festzulegen, die um ein Vielfaches langsamer sind, als es ein Feldsatz sein würde. Weitere Informationen finden Sie unter Wählen zwischen Eigenschaften und Methoden.
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; }
}
}
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
Die Text-Eigenschaft ist über PriorityBinding an das oben genannte 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, beginnt es mit der ersten Binding, die an die SlowestDP
-Eigenschaft gebunden ist. Bei der Verarbeitung dieser Binding wird kein Wert erfolgreich zurückgegeben, da sie 5 Sekunden inaktiv ist, sodass das nächste Binding-Element verarbeitet wird. Die nächste Binding gibt keinen Wert zurück, weil sie 3 Sekunden inaktiv ist. Das Bindungsmodul fährt dann mit dem nächsten Binding-Element fort, das an die FastDP
-Eigenschaft gebunden ist. Diese Binding gibt dem Wert „Fast Value“ zurück. Die TextBlock zeigt nun den Wert „Fast Value“ an.
Nach Ablauf von 3 Sekunden gibt die SlowerDP
-Eigenschaft den Wert „Slower Value“ zurück. Anschließend zeigt die TextBlock den Wert „Slower Value“ an.
Nach Ablauf von 5 Sekunden gibt die SlowestDP
-Eigenschaft den Wert „Slowest Value“ zurück. Diese Bindung hat die höchste Priorität, da sie zuerst aufgeführt ist. Die TextBlock zeigt nun den Wert „Slowest Value“ an.
Unter PriorityBinding finden Sie Informationen darüber, was als erfolgreicher Rückgabewert einer Bindung gilt.
Weitere Informationen
.NET Desktop feedback
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für