방법: PriorityBinding 구현

WPF(Windows Presentation Foundation)의 PriorityBinding은 바인딩 목록을 지정하여 작동합니다. 바인딩 목록은 가장 높은 우선 순위에서 가장 낮은 우선 순위로 정렬됩니다. 우선 순위가 가장 높은 바인딩이 처리될 때 값을 성공적으로 반환하는 경우 목록의 다른 바인딩을 처리할 필요가 없습니다. 우선 순위가 가장 높은 바인딩을 평가하는 데 시간이 오래 걸리는 경우 우선 순위가 높은 바인딩이 값을 성공적으로 반환할 때까지 값을 반환하는 다음으로 높은 우선 순위가 사용됩니다.

예제

PriorityBinding의 작동 방식을 설명하기 위해 AsyncDataSource 개체가 FastDP, SlowerDPSlowestDP의 세 가지 속성으로 생성되었습니다.

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 속성은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 속성은 “Slower Value” 값을 반환합니다. 해당 바인딩은 먼저 나열되기 때문에 우선 순위가 가장 높습니다. 이제 TextBlock이 “Slowest Value” 값을 표시합니다.

바인딩에서 성공적인 반환 값으로 간주되는 항목에 대한 자세한 내용은 PriorityBinding을 참조하세요.

참고 항목