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



有两个页面:MainPageAddQuotePage

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

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

MainPage的工作方式类似于在其Frame不同应用程序中加载的shellMainPage具有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引用属性以使数据绑定有效?

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

MainPage.xam.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中设置绑定类似:

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

最新更新