[.net] RelativeSource와 함께 WPF 바인딩을 어떻게 사용합니까?

RelativeSourceWPF 바인딩과 함께 사용하는 방법 과 다른 사용 사례는 무엇입니까?



답변

객체의 다른 속성에 바인딩하려는 경우 :

{Binding Path=PathToProperty, RelativeSource={RelativeSource Self}}

조상에 재산을 얻으려면 :

{Binding Path=PathToProperty,
    RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}}

템플릿 부모에서 속성을 얻으려면 ControlTemplate에서 양방향 바인딩을 수행 할 수 있습니다.

{Binding Path=PathToProperty, RelativeSource={RelativeSource TemplatedParent}}

또는 더 짧습니다 (OneWay 바인딩에서만 작동 함).

{TemplateBinding Path=PathToProperty}


답변

Binding RelativeSource={
    RelativeSource Mode=FindAncestor, AncestorType={x:Type ItemType}
}
...

의 기본 속성 RelativeSource은 IS Mode속성입니다. MSDN에서 제공하는 유효한 값의 전체 세트는 다음과 같습니다 .

  • PreviousData 표시되는 데이터 항목 목록에서 이전 데이터 항목 (데이터 항목이 포함 된 컨트롤이 아님)을 바인딩 할 수 있습니다.

  • TemplatedParent 템플릿 (데이터 바인딩 된 요소가있는)이 적용되는 요소를 나타냅니다. 이는 TemplateBindingExtension 설정과 유사하며 바인딩이 템플리트 내에있는 경우에만 적용 가능합니다.

  • 자체 바인딩을 설정하는 요소를 참조하고 해당 요소의 한 속성을 같은 요소의 다른 속성에 바인딩 할 수 있습니다.

  • FindAncestor 데이터 바인딩 된 요소의 부모 체인에있는 조상을 나타냅니다. 이를 사용하여 특정 유형의 조상 또는 해당 서브 클래스에 바인딩 할 수 있습니다. AncestorType 및 / 또는 AncestorLevel을 지정하려는 경우 사용하는 모드입니다.


답변

다음은 MVVM 아키텍처와 관련하여보다 시각적 인 설명입니다.

여기에 이미지 설명을 입력하십시오


답변

Bechir Bejaoui는 그의 기사 에서 WPF의 RelativeSources 사용 사례를 공개합니다 .

RelativeSource는 특정 객체의 속성을 객체 자체의 다른 속성에 바인딩하려고 할 때, 특정 객체의 속성을 상대 부모 중 하나에 바인딩하려고 할 때 특히 바인딩 케이스에 사용되는 태그 확장입니다. 사용자 지정 컨트롤 개발 및 일련의 바운드 데이터 차등을 사용하는 경우 종속성 속성 값을 XAML에 바인딩 할 때 이러한 모든 상황은 상대 소스 모드로 표시됩니다. 모든 사례를 하나씩 공개하겠습니다.

  1. 모드 자체 :

높이가 항상 너비와 같기를 원하는 사각형 인이 경우를 상상해보십시오. 우리는 요소 이름을 사용 하여이 작업을 수행 할 수 있습니다

<Rectangle Fill="Red" Name="rectangle"
                Height="100" Stroke="Black"
                Canvas.Top="100" Canvas.Left="100"
                Width="{Binding ElementName=rectangle,
                Path=Height}"/>

그러나이 경우 바인딩 객체의 이름, 즉 사각형을 표시해야합니다. RelativeSource를 사용하여 동일한 목적에 다르게 도달 할 수 있습니다

<Rectangle Fill="Red" Height="100"
               Stroke="Black"
               Width="{Binding RelativeSource={RelativeSource Self},
               Path=Height}"/>

이 경우 바인딩 객체의 이름을 언급 할 의무가 없으며 높이가 변경 될 때마다 너비는 항상 높이와 같습니다.

너비를 높이의 절반으로 매개 변수화하려면 바인딩 태그 확장에 변환기를 추가하여이 작업을 수행 할 수 있습니다. 다른 경우를 상상해 봅시다.

 <TextBlock Width="{Binding RelativeSource={RelativeSource Self},
               Path=Parent.ActualWidth}"/>

위의 경우는 주어진 요소의 주어진 속성을 직접 부모의 속성 중 하나에 묶는 데 사용됩니다.이 요소에는 Parent라는 속성이 있습니다. 이것은 다른 상대 소스 모드 인 FindAncestor 모드로 연결됩니다.

  1. 모드 찾기

이 경우 주어진 요소의 속성은 부모 중 하나 인 Corse에 연결됩니다. 위의 경우와의 주요 차이점은 속성을 연결하는 계층 구조에서 상위 유형과 상위 순위를 결정하는 것은 사용자의 책임입니다. 그건 그렇고이 XAML 조각으로 놀아보십시오.

<Canvas Name="Parent0">
    <Border Name="Parent1"
             Width="{Binding RelativeSource={RelativeSource Self},
             Path=Parent.ActualWidth}"
             Height="{Binding RelativeSource={RelativeSource Self},
             Path=Parent.ActualHeight}">
        <Canvas Name="Parent2">
            <Border Name="Parent3"
            Width="{Binding RelativeSource={RelativeSource Self},
           Path=Parent.ActualWidth}"
           Height="{Binding RelativeSource={RelativeSource Self},
              Path=Parent.ActualHeight}">
               <Canvas Name="Parent4">
               <TextBlock FontSize="16"
               Margin="5" Text="Display the name of the ancestor"/>
               <TextBlock FontSize="16"
                 Margin="50"
            Text="{Binding RelativeSource={RelativeSource
                       FindAncestor,
                       AncestorType={x:Type Border},
                       AncestorLevel=2},Path=Name}"
                       Width="200"/>
                </Canvas>
            </Border>
        </Canvas>
     </Border>
   </Canvas>

위 상황은 일련의 테두리 안에 포함 된 두 개의 TextBlock 요소와 계층 적 부모를 나타내는 캔버스 요소입니다. 두 번째 TextBlock은 상대 소스 수준에서 주어진 부모의 이름을 표시합니다.

따라서 AncestorLevel = 2를 AncestorLevel = 1로 변경하고 어떻게되는지보십시오. 그런 다음 조상의 유형을 AncestorType = Border에서 AncestorType = Canvas로 변경하고 어떻게되는지보십시오.

표시되는 텍스트는 조상 유형 및 레벨에 따라 변경됩니다. 그러면 조상 수준이 조상 유형에 적합하지 않으면 어떻게됩니까? 좋은 질문입니다. 물어 보려고한다는 것을 알고 있습니다. 응답은 예외가 발생하지 않으며 TextBlock 수준에 아무것도 표시되지 않습니다.

  1. TemplatedParent

이 모드에서는 지정된 ControlTemplate 속성을 ControlTemplate이 적용된 컨트롤의 속성에 연결할 수 있습니다. 여기에 문제를 잘 이해하려면 다음 예가 있습니다.

<Window.Resources>
<ControlTemplate x:Key="template">
        <Canvas>
            <Canvas.RenderTransform>
                <RotateTransform Angle="20"/>
                </Canvas.RenderTransform>
            <Ellipse Height="100" Width="150"
                 Fill="{Binding
            RelativeSource={RelativeSource TemplatedParent},
            Path=Background}">

              </Ellipse>
            <ContentPresenter Margin="35"
                  Content="{Binding RelativeSource={RelativeSource
                  TemplatedParent},Path=Content}"/>
        </Canvas>
    </ControlTemplate>
</Window.Resources>
    <Canvas Name="Parent0">
    <Button   Margin="50"
              Template="{StaticResource template}" Height="0"
              Canvas.Left="0" Canvas.Top="0" Width="0">
        <TextBlock FontSize="22">Click me</TextBlock>
    </Button>
 </Canvas>

주어진 컨트롤의 속성을 컨트롤 템플릿에 적용하려면 TemplatedParent 모드를 사용할 수 있습니다. 이 태그 확장과 비슷한 것이 있는데, 첫 번째 것의 일종 인 TemplateBinding 인 TemplateBinding이지만, 첫 번째 런타임 직후에 평가되는 TemplatedParent와 대조적으로 컴파일 타임에 TemplateBinding이 평가됩니다. 아래 그림에서 알 수 있듯이 배경과 내용은 단추 내에서 컨트롤 템플릿에 적용됩니다.


답변

WPF RelativeSource바인딩 properties에서 다음을 설정하기 위해 3 을 노출합니다 .

1. 모드 : 다음과 같은 enum네 가지 값을 가질 수 있습니다.

ㅏ. PreviousData ( value=0) : 의 이전 값을property바인딩 된값에 할당합니다

비. TemplatedParent ( value=1) :templates 컨트롤을 정의 할 때 사용되며의 값 / 속성에 바인딩하려고합니다control.

예를 들어, 다음을 정의하십시오 ControlTemplate.

  <ControlTemplate>
        <CheckBox IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
 </ControlTemplate>

씨. 자기 ( value=2) : 우리가에서 바인딩 할 때self또는property자기의.

예를 들면 다음checkbox같습니다.CommandParameterCommand 켜기 를 설정하는 동안CheckBox

<CheckBox ...... CommandParameter="{Binding RelativeSource={RelativeSource Self},Path=IsChecked}" />

디. FindAncestor ( value=3) : 부모로부터 바인딩 할 때control
에서Visual Tree.

예를 들어 바인딩 checkbox에서 records만약grid , 경우는 header checkbox체크

<CheckBox IsChecked="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type iDP:XamDataGrid}}, Path=DataContext.IsHeaderChecked, Mode=TwoWay}" />

2. 조상 유형 : mode가 FindAncestor어떤 조상 유형을 정의 할 때

RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type iDP:XamDataGrid}}

3. 조상 레벨 : mode가 FindAncestor조상 레벨 인 경우 (에 동일한 유형의 상위가 두 개있는 경우 visual tree)

RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type iDP:XamDataGrid, AncestorLevel=1}}

위의 모든 사용 사례는 RelativeSource binding .

참조 링크는 다음과 같습니다 .


답변

TemplatedParent를 잊지 마십시오 :

<Binding RelativeSource="{RelativeSource TemplatedParent}"/>

또는

{Binding RelativeSource={RelativeSource TemplatedParent}}


답변

Silverlight에 대한 이러한 생각에 걸려 넘어지는 사람들에게는 다음과 같은 점에 주목할 가치가 있습니다.

Silverlight는 이러한 명령 중 축소 된 하위 집합 만 제공합니다.