次の方法で共有


方法: PriorityBinding を実装する

Windows Presentation Foundation (WPF) の PriorityBinding は、バインディングのリストを指定することによって機能します。 バインディングのリストは、優先順位が最も高いものから低いものの順に並べられています。 処理時に最も優先順位の高いバインディングから値が正常に返された場合、リスト内の他のバインディングを処理する必要はありません。 最も優先順位の高いバインディングの評価に長い時間がかかっているため、優先順位が高いバインディングから値が正常に返されるまで、次に優先順位が高くて値が正常に返されるバインディングが使用される場合があります。

PriorityBinding 動作を示すため、3 つのプロパティ FastDPSlowerDPSlowestDP を含む AsyncDataSource オブジェクトが作成されています。

FastDP の get アクセサーでは、_fastDP データ メンバーの値が返されます。

SlowerDP の get アクセサーでは、3 秒間待ってから、_slowerDP データ メンバーの値が返されます。

SlowestDP の get アクセサーでは、5 秒間待ってから、_slowestDP データ メンバーの値が返されます。

注意

この例は、デモンストレーション目的のみで提供されます。 .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 プロパティは、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 オブジェクトを処理するときに、SlowestDP プロパティにバインドされている最初の Binding から開始されます。 この Binding は処理されても 5 秒間スリープ状態になるため値が正常に返されないので、次の Binding 要素が処理されます。 次の Binding も 3 秒間スリープするため、値が正常に返されません。 バインディング エンジンは、次に、FastDP プロパティにバインドされている Binding 要素に移動します。 この Binding では、値 "Fast Value" が返されます。 TextBlock に値 "Fast Value" が表示されます。

3 秒経過すると、SlowerDP プロパティから値 "Slower Value" が返されます。 TextBlock に、値 "Slower Value" が表示されます。

5 秒経過すると、SlowestDP プロパティから値 "Slowest Value" が返されます。 そのバインディングは、リストの先頭にあるので最も高い優先順位です。 TextBlock に値 "Slowest Value" が表示されます。

何をもってバインディングからの戻り値が成功と見なされるかについては、PriorityBinding を参照してください。

関連項目