WPF 데이터 바인딩의 "RelativeSource Findancestor"는 정확히 무엇입니까?
-
06-07-2019 - |
문제
현재 WPF 사용자 컨트롤 내에서 작업 중입니다 (XAML 파일의 루트 요소는 "UserControl"). 데이터 바인딩을 사용하여 창의 속성에 어떻게 액세스 할 수 있습니까?
누구든지 간단한 이유를 알고 있습니까?
<Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type Window}}" Path="..." />
작동하지 않습니까? 내가 얻는 오류 메시지는 다음과 같습니다.
System.Windows.Data 경고 : 4 : 참조와 바인딩을위한 소스를 찾을 수 없습니다.
편집하다: 나는 Arsenmkrt의 접근 방식에 대한 변형을 사용하여 그의 대답을 받아 들였습니다. 그러나 나는 여전히 Findancestor가 "그냥 일하지 않는"이유를 찾는 데 여전히 관심이 있습니다.
해결책
가장 좋은 방법은 UserControl에 이름을 부여하는 것입니다.
usercontrol에서 바인딩하는 것보다 두 가지 방법 바인딩으로 Usercontrol에서 종속성 속성 속성 MyProperty를 작성하십시오.
<UserControl x:Name = "myControl">
<Label Content={Binding ElementName= myControl, Path=MyProperty}/>
</UserControl>
다른 팁
당신이 '탈출'하려고한다면 ItemsControl
또는 DataGridView
a Window
당신은 그 조상을 찾을 수 있습니다 x:Type Window
작동하지 않습니다. 아니면 적어도 ...
이 경우 블렌드 또는 비주얼 스튜디오를 실행하고 설계 시간에 데이터가 표시 될 것으로 기대할 수 있습니다. VS + 블렌드가 실제로 Windows가 아닌 고유 한 인스턴스를 생성하기 때문입니다. 런타임에는 잘 작동하지만 디자인 모드에서는 그렇지 않습니다.
당신이 할 수있는 몇 가지 일이 있습니다.
Usercontrol을 감싸십시오
다음은 제가 생각해 낸 대체 솔루션입니다. 당신이 참조하지 않는다는 점에서 하나의 이점이 있습니다.
UserControl
또는Window
직접, 부모 컨테이너를 변경하면 코드가 파손되지 않습니다.<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:views="clr-namespace:MyWPFApplication.Views" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="MyWPFApplication.Views.UPCLabelPrinterWindow" mc:Ignorable="d" x:Name="LayoutRoot" Title="UPCLabelPrinterWindow"> <views:DataContextWrapper> <DockPanel> ... </DockPanel> </views:DataContextWrapper>
어디에 DataContextWrapper
단지 그리드입니다
namespace MyWPFApplication.Views {
public class DataContextWrapper : Grid
{
}
}
그런 다음 묶을 때 다음을 수행합니다.
<TextBlock Text="{Binding="{Binding DataContext.SomeText,
RelativeSource={RelativeSource AncestorType={x:Type views:DataContextWrapper},
Mode=FindAncestor}}" />
참고 : 창 자체의 속성에 묶고 싶다면 더 까다 롭고 종속성 속성이나 그와 비슷한 것을 통해 묶어야 할 것입니다. 그러나 MVVM을 사용하고 있다면 이것은 내가 찾은 솔루션 중 하나입니다.
다음과 같이 모드 = "OnewayTosource"를 설정해야한다고 생각합니다.
<TextBox Text="{Binding RelativeSource={RelativeSource FindAncestor ,AncestorType={x:Type Grid}},Path=BackGround , Mode=OneWayToSource , UpdateSourceTrigger = PropertyChanged}" />