RelativeSource
WPF 바인딩과 함께 사용하는 방법 과 다른 사용 사례는 무엇입니까?
답변
객체의 다른 속성에 바인딩하려는 경우 :
{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에 바인딩 할 때 이러한 모든 상황은 상대 소스 모드로 표시됩니다. 모든 사례를 하나씩 공개하겠습니다.
- 모드 자체 :
높이가 항상 너비와 같기를 원하는 사각형 인이 경우를 상상해보십시오. 우리는 요소 이름을 사용 하여이 작업을 수행 할 수 있습니다
<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 모드로 연결됩니다.
- 모드 찾기
이 경우 주어진 요소의 속성은 부모 중 하나 인 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 수준에 아무것도 표시되지 않습니다.
- 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
같습니다.CommandParameter
Command
켜기 를 설정하는 동안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는 이러한 명령 중 축소 된 하위 집합 만 제공합니다.