문제

현재 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}" />
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top