如何将元素属性绑定到UWP中祖先页面的属性

时间:2016-07-19 22:51:24

标签: c# xaml data-binding windows-10 uwp

有两页: MainPage AddQuotePage

位于项目根文件夹中的MainPage.xaml有一个Frame,用于加载位于 Views 文件夹中的AddQuotePage.xaml。

MainPage 包含标题栏RelativePanelSplitView,用于在Frame中显示汉堡包菜单和内容。

MainPage 就像在其Frame个不同应用中加载的shell一样 MainPage 具有List<Icon> CategoryIcons属性。

AddQuotePage 包含GridView我要为其设置ItemsSource="{Binding MainPage.CategoryIcons}"并设置一个像这样的ItemTemplate

<GridView ItemsSource="{Binding MainPage.CategoryIcons}">
    <GridView.ItemTemplate>
        <DataTemplate x:DataType="data:Icon">
             <BitmapIcon UriSource="{x:Bind Uri}" />
        </DataTemplate>
    </GridView.ItemTemplate>
 </GridView>

这不起作用。在WPF中你会{Binding Path=PathToProperty, RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}},但这在UWP中并不存在,或者至少我没有找到它。

如何从MainPage引用属性以使数据绑定有效?

1 个答案:

答案 0 :(得分:0)

我不确定你想在AddQuotePage中实现什么。出于不同的目的,答案可能会有所不同。 CategoryIcons属性与ViewModel相关,通常不应该在“shell”中,而是在AddQuotePage的ViewModel中。但是,如果您只想在AddQuotePage中显示CategoryIcons,一种简单的方法是我们可以在MainPage中定义代表MainPage本身的公共静态属性,然后在其他页面中我们可以使用此属性访问MainPage中的属性。例如:

MainPage.xaml.cs 中:

public sealed partial class MainPage : Page
{
    //define a public static property represent the MainPage itself
    public static MainPage Main { get; set; }

    public List<Icon> CategoryIcons { get; set; }

    public MainPage()
    {
        this.InitializeComponent();
        ///initialize Main property
        Main = this;
    }

    ...
}

然后在 AddQuotePage.xaml.cs 中,我们可以将Page.DataContext设置为MainPage.Main

public AddQuotePage()
{
    this.InitializeComponent();
    this.DataContext = MainPage.Main;
}

GridView设置Binding就像:

<GridView ItemsSource="{Binding CategoryIcons}">
    <GridView.ItemTemplate>
        <DataTemplate x:DataType="data:Icon">
             <BitmapIcon UriSource="{x:Bind Uri}" />
        </DataTemplate>
    </GridView.ItemTemplate>
 </GridView>