2017-03-22 3 views
-1

내가 겪고있는 문제에 대한 해결책을 찾기 위해 애쓴다. 나는 주변에서 놀고있는 UWP 앱을 가지고 있으며, 대부분은 일을 할 수 있었다. .프레임의 페이지에서 사용자 정의 컨트롤에서 DataContext에 액세스 할 때의 문제

내가 직면 한 문제는 Hambuger Menu와 관련된 것입니다. 항목을 그리드 뷰로 표시하는 페이지를로드하는 프레임이 있습니다. 클릭하면 해당 프레임에 다른 페이지가 표시됩니다.

페이지에 데이터를 전혀 표시 할 수없는 새 페이지가 있습니다. 이 페이지의 XAML에서

public sealed partial class CreatureDossier : Page 
{ 
    private Species Cat; 

    public CreatureDossier() 
    { 
     this.InitializeComponent(); 
    } 

    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     Cat = (Species)e.Parameter; 
    } 
} 

는 내가 존재하고 어디 고투있는 데이터를 사용하고자하는 UserControl이를 걸었습니다. User Control을 중단 할 때마다 DataContext가 비어 있음 (null)으로 표시됩니다. 내가
<UIControls:DossierPanel /> 

을 시도

정말 DataContext를가 null의 언급 나는이 사용자 제어, 내가 UserControl을에 있지만 같은이 있다고 지적한다의 DataContext를 사용할 수 있도록 할 필요가있는 무슨 이해하지 못하는 .

<TextBlock x:Name="CatName" Text="{Binding Cat.name}" /> 

이제 재미있는 것은 내가 일반 텍스트 문자열과 뒤에 UserControl을 코드에서 DependencyProperty에와있는 UserControl에 고양이라는 속성을 사용하는 경우, 내가 생성자에서 = this.DataContext와이 그를 표시 할 수 있다는 것입니다 .

사용자 제어 코드

public sealed partial class DossierPanel : UserControl 
{ 
    public Models.Species Cat { get { return this.DataContext as Models.Species; } } 

    public DossierPanel() 
    { 
     this.InitializeComponent(); 
    } 
} 

CreatureDossier.xaml

<TextBlock x:Name="CreatureName" Text="{x:Bind Cat.name}" /> 
    <UIControls:DossierPanel /> 

내가 좋은 것입니다 무엇을해야하는지 이해하는 데 어떤 도움 뒤에.

답변

0

설정의 DataContextPage 다음 UserControl은 다음 Page (명시 적으로 다른 곳의 DataContext 속성을 설정하지 않는 것이 가정)에서 DataContext을 상속하고 결합 할 수 있어야한다

public sealed partial class CreatureDossier : Page 
{ 
    private Species Cat; 

    public CreatureDossier() 
    { 
     this.InitializeComponent(); 
    } 

    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     Cat = (Species)e.Parameter; 
     DataContext = Cat; 
    } 
} 

<TextBlock x:Name="CatName" Text="{Binding name}" /> 

편집 :이 같은 Species 클래스의 공공 재산 당신이 UserControlx:Name 주면 https://docs.microsoft.com/en-us/windows/uwp/xaml-platform/x-bind-markup-extension

을 :하지만{x:Bind}는 기본 소스로 DataContext를 사용하지 않는

<UIControls:DossierPanel x:Name="uc" /> 

을 ...그리고 Cat 속성에 세터를 추가

public sealed partial class DossierPanel : UserControl 
{ 
    public Models.Species Cat { get; set; } 

    public DossierPanel() 
    { 
     this.InitializeComponent(); 
    } 
} 

그리고 설정이 하나가 고양이이 페이지에의 DataContext를 설정하면서, 작업 표시되지 않습니다

public sealed partial class CreatureDossier : Page 
{ 
    public CreatureDossier() 
    { 
     this.InitializeComponent(); 
    } 

    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     uc.Cat = (Species)e.Parameter; 
    } 
} 

<TextBlock x:Name="CatName" Text="{Binding Cat.name, Mode=OneWay}" /> 
+0

이전에이 정보를 표시 할 데이터가 이미 있습니다. 반면에 사용자 정의 컨트롤은 null로 DataContext를 표시합니다. UserControl 위로 Cat 객체를 전달하는 DP의 초기 방법을 사용해야합니까? 원래 나는이 대중이 부분 클래스 DossierPanel 밀봉했다 : UserControl을 를 { 공공 Models.Species 고양이 {Models.Species로 this.DataContext 반환 {얻을; }} public DossierPanel() { this.InitializeComponent(); } } –

+0

DossierPanel의 DataContext를 설정하면 안됩니다. 이러는거야? 이 내용을 읽고 이에 따라 질문을 수정하십시오. https://stackoverflow.com/help/mcve – mm8

+0

아니요 DossierPanel에 DataContext를 설정하지 않습니다. 데이터를 반환하는 읽기 전용 속성이 있습니다. –

관련 문제