WPF 사용자 컨트롤: 종속성 속성의 XAML 바인딩 문제
WPF 사용자 컨트롤의 XAML 내에서 종속성 속성에 바인딩하는 것은 까다로울 수 있습니다. 일반적인 시나리오를 살펴보겠습니다.
TextBlock을 사용한 사용자 제어:
<code class="language-xml"><UserControl ... x:Class="WpfTest.MyControl"> <TextBlock Text="{Binding Test}" /> </UserControl></code>
사용자 컨트롤의 종속성 속성:
<code class="language-csharp">public static readonly DependencyProperty TestProperty = DependencyProperty.Register( "Test", typeof(string), typeof(MyControl), new PropertyMetadata("DEFAULT")); public string Test { get { return (string)GetValue(TestProperty); } set { SetValue(TestProperty, value); } }</code>
MainWindow ViewModel(또는 DataContext):
<code class="language-csharp">private string _myText = "default"; public string MyText { get { return _myText; } set { _myText = value; NotifyPropertyChanged(); } }</code>
MainWindow에서 바인딩(성공):
<code class="language-xml"><TextBlock Text="{Binding MyText}" /></code>
사용자 컨트롤 바인딩(실패):
<code class="language-xml"><MyControl Test="{Binding MyText}" /></code>
코드 숨김 바인딩(성공):
<code class="language-csharp">TheControl.SetBinding(MyControl.TestProperty, new Binding { Source = DataContext, Path = new PropertyPath("MyText"), Mode = BindingMode.TwoWay });</code>
근본 원인:
바인딩 소스가 명시적으로 정의되지 않았기 때문에 사용자 컨트롤 내의 XAML 바인딩이 실패합니다. 기본값은 사용자 컨트롤 자체 속성입니다.
해결책:
RelativeSource
:
<code class="language-xml"><UserControl ... x:Class="WpfTest.MyControl"> <TextBlock Text="{Binding Test, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" /> </UserControl></code>
이는 UserControl
속성에 대해 Test
유형의 조상을 검색하도록 바인딩에 명시적으로 지시합니다. 또는 데이터 컨텍스트가 창 수준에 있는 경우 AncestorType={x:Type Window}
을 사용할 수 있습니다.
주요 고려 사항:
DataContext
을 설정하는 것은 일반적으로 권장되지 않으며 바인딩 문제가 발생할 수 있습니다.이러한 지침을 따르면 WPF 사용자 컨트롤 내의 종속성 속성에 안정적으로 바인딩할 수 있습니다.
위 내용은 WPF 사용자 컨트롤의 종속성 속성에 대해 내 XAML 바인딩이 작동하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!