次の方法で共有


方法: PriorityBinding を実装する

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

PriorityBindingのしくみを示すために、AsyncDataSource オブジェクトは、FastDPSlowerDPSlowestDPの 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 を参照してください。

こちらも参照ください