方法 : PriorityBinding を実装する
更新 : 2007 年 11 月
Windows Presentation Foundation (WPF) における PriorityBinding は、バインディング リストの指定により機能します。バインディング リストは、優先順位の高いものから低いものに順番に並べられています。優先順位の最も高いバインディングが処理された際に値を正常に返した場合は、リスト内の他のバインディングを処理する必要はありません。優先順位の最も高いバインディングの評価に時間がかかる場合は、そのバインディングが値を正常に返すまで、正常に値を返した 2 番目に優先順位の高いバインディングが使用されることがあります。
使用例
PriorityBinding の動作を示すため、FastDP、SlowerDP、および SlowestDP という 3 つのプロパティを持つ AsyncDataSource オブジェクトを作成しています。
FastDP の get アクセサは、_fastDP データ メンバの値を返します。
SlowerDP の get アクセサは、3 秒待機してから _slowerDP データ メンバの値を返します。
SlowestDP の get アクセサは、5 秒待機してから _slowestDP データ メンバの値を返します。
メモ : |
---|
この例は、デモンストレーションのためだけに作成されています。フィールド セットよりもはるかに時間がかかるため、Microsoft .NET ガイドラインではプロパティを定義しないように推奨しています。詳細については、「プロパティとメソッドの選択」を参照してください。 |
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; }
}
}
Text プロパティは、PriorityBinding を次のように使用して、上の AsyncDS にバインドされます。
<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 には、値 "Slowest Value" が表示されます。
どのような値がバインディングからの正常な戻り値と見なされるかについては、PriorityBinding を参照してください。
サンプル全体については、「PriorityBinding を使用したバインディングのサンプル」を参照してください。