在框架内从用户控件访问DataContext的问题

时间:2017-03-22 14:36:57

标签: c# wpf xaml user-controls uwp

为了找到我遇到的这个问题的解决方案,我有一个UWP应用程序,我一直在玩,并且大部分已经能够解决问题。

我面临的问题是汉堡菜单,我有一个框架,我加载页面,显示项目的网格视图。单击它然后在该帧中显示另一页。

新页面具有此功能,我可以在页面中显示数据,完全没有问题。

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

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

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

在本页的XAML中,我正在放置一个UserControl,我想使用现有的数据,这是我在苦苦挣扎的地方。每次我打破用户控件时,它都会将DataContext显示为空(null)。

我试过了

<UIControls:DossierPanel />

真的不明白我需要做些什么才能让这个User Control使用DataContext,我应该指出我在UserControl中有这个,但是如上所述,DataContext为null。

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

现在有趣的是,如果我在Usercontrol上使用一个名为Cat的属性,后面有UserControl代码中的普通文本字符串和DependencyProperty,我可以在构造函数中使用this.DataContext = this显示它。

背后的用户控制代码

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  />

了解我需要做什么的任何帮助都会很棒。

1 个答案:

答案 0 :(得分:0)

设置DataContext的{​​{1}}:

Page

然后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; } } 将从UserControl继承DataContext(假设您没有在其他地方显式设置DataContext属性)并且您应该能够绑定到任何公共Page类的属性如下:

Species

修改 <TextBlock x:Name="CatName" Text="{Binding name}" /> 不使用{x:Bind}作为默认来源:https://docs.microsoft.com/en-us/windows/uwp/xaml-platform/x-bind-markup-extension

但是如果你给DataContext UserControl

x:Name

...并在<UIControls:DossierPanel x:Name="uc" /> 属性中添加一个setter:

Cat

并设置这个:

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

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

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