PriorityBinding Windows Presentation Foundation (WPF) では、バインドの一覧を指定することで機能します。 バインディングの一覧は、優先度が最も高いものから優先度が最も低いものに並べ替えられます。 最も優先度の高いバインディングが処理されたときに値を正常に返す場合、リスト内の他のバインドを処理する必要はありません。 最も優先度の高いバインディングの評価に時間がかかる場合があります。値を正常に返す次に高い優先度は、優先度の高いバインディングが値を正常に返すまで使用されます。
例
PriorityBindingのしくみを示すために、AsyncDataSource
オブジェクトは、FastDP
、SlowerDP
、SlowestDP
の 3 つのプロパティを使用して作成されています。
FastDP
の get アクセサーは、_fastDP
データ メンバーの値を返します。
SlowerDP
の get アクセサーは、_slowerDP
データ メンバーの値を返す前に 3 秒間待機します。
SlowestDP
の get アクセサーは、_slowestDP
データ メンバーの値を返す前に 5 秒間待機します。
注
この例はデモンストレーションのみを目的としています。 .NET ガイドラインでは、フィールド セットよりも桁違いに遅いプロパティを定義しないことを推奨しています。 詳細については、「 プロパティとメソッドの選択」を参照してください。
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
Textプロパティは、AsyncDS
を使用して上記の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>
バインド エンジンは、 Binding オブジェクトを処理するときに、最初の Bindingで始まり、 SlowestDP
プロパティにバインドされます。 この Binding が処理されると、5 秒間スリープ状態になっているため、値が正常に返されないため、次の Binding 要素が処理されます。 次の Binding は、3 秒間スリープしているため、値を正常に返しません。 その後、バインド エンジンは次の Binding 要素に移動します。この要素は、 FastDP
プロパティにバインドされます。 この Binding は値 "Fast Value" を返します。
TextBlockに値 "Fast Value" が表示されるようになりました。
3 秒が経過すると、 SlowerDP
プロパティは値 "Slower Value" を返します。 その後、TextBlock に「Slower Value」という値が表示されます。
5 秒が経過すると、 SlowestDP
プロパティは値 "Slowest Value" を返します。 最初に一覧表示されるため、そのバインディングの優先度が最も高くなります。
TextBlockに"最も遅い値" という値が表示されるようになりました。
バインディングからの正常な戻り値と見なされる内容については、 PriorityBinding を参照してください。
こちらも参照ください
.NET Desktop feedback