Postupy: Implementace PriorityBindingu
PriorityBinding ve Windows Presentation Foundation (WPF) funguje zadáním seznamu vazeb. Seznam vazeb je seřazený od nejvyšší priority po nejnižší prioritu. Pokud vazba s nejvyšší prioritou při zpracování úspěšně vrátí hodnotu, není nikdy nutné zpracovat ostatní vazby v seznamu. Může se jednat o případ, že vyhodnocení vazby s nejvyšší prioritou trvá dlouhou dobu. Další nejvyšší priorita, která vrátí hodnotu úspěšně, se použije, dokud vazba vyšší priority nevrátí hodnotu úspěšně.
Příklad
Abychom ukázali, jak PriorityBinding funguje, byl objekt AsyncDataSource
vytvořen s následujícími třemi vlastnostmi: FastDP
, SlowerDP
a SlowestDP
.
Přístupový člen get FastDP
vrací hodnotu datového členu _fastDP
.
Přístupová metoda pro získání SlowerDP
čeká 3 sekundy, než vrátí hodnotu datového člena _slowerDP
.
Přístup SlowestDP
čeká 5 sekundy před vrácením hodnoty člena dat _slowestDP
.
Poznámka
Tento příklad je určen pouze pro demonstrační účely. Pokyny .NET nedoporučují definovat vlastnosti, které jsou řádově pomalejší než by byla sada polí. Další informace naleznete v tématu volba mezi vlastnostmi a metodami.
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
Vlastnost Text se sváže s výše uvedenými AsyncDS
pomocí PriorityBinding:
<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>
Vazební modul zpracuje objekty Binding a začíná s prvním Binding, který je vázán na vlastnost SlowestDP
. Při zpracování tohoto Binding nevrací úspěšně hodnotu, protože spí po dobu 5 sekund, takže se zpracuje další Binding prvek. Další Binding nevrací hodnotu úspěšně, protože spí po dobu 3 sekund. Vazební modul se pak přesune na další prvek Binding, který je vázán na vlastnost FastDP
. Tato Binding vrátí hodnotu "Rychlá hodnota".
TextBlock nyní zobrazuje hodnotu "Rychlá hodnota".
Po uplynutí 3 sekund vlastnost SlowerDP
vrátí hodnotu „Pomalejší hodnota“.
TextBlock pak zobrazí hodnotu "Pomalejší hodnota".
Po uplynutí 5 sekund vrátí vlastnost SlowestDP
hodnotu "Nejpomalejší hodnota". Tato vazba má nejvyšší prioritu, protože je uvedená jako první.
TextBlock teď zobrazí hodnotu "Nejpomalejší hodnota".
Informace o tom, co se považuje za úspěšnou návratovou hodnotu z vazby, najdete v PriorityBinding.
Viz také
- Binding.IsAsync
- Přehled datových vazeb
- témata návodů
.NET Desktop feedback