如何使全局属性在 Windows 10 应用的所有页面中可见

本文关键字:应用 何使全 属性 Windows | 更新日期: 2023-09-27 18:33:33

我正在考虑一个代表应用商店的应用程序,我正在使用 GridView 查看项目,数据表示为可观察集合。

我的 XAML 代码 :

xmlns:data="using:ItemsStore.Models"
<GridView ItemsSource="{x:Bind ItemsList}">
        <GridView.ItemTemplate>
            <DataTemplate x:DataType="data:Item">                 
                    <StackPanel Orientation="Vertical">
                       <Image Source="{x:Bind ImageSource}"/>
                       <TextBlock  Text="{x:Bind Name}"/>
                       <TextBlock  Text="{x:Bind Disc}"/>
                    </StackPanel>
            </DataTemplate>
        </GridView.ItemTemplate>
</GridView>

主页中的 C# 代码:

public sealed partial class MainPage : Page
{
    public ObservableCollection<Item> ItemsList;
    public MainPage()
    {
        this.InitializeComponent();
        ItemsList = new ObservableCollection<Item>(); 
    }
}

我添加了一个按钮和一些输入控件来将新项目添加到 ItemsList,它工作得很好,但我想制作另一个页面,其中包含将新项目添加到列表的控件和逻辑,所以我制作了 AddNew.xaml 页面,但我无法访问主页中的 ObservableCollection 以向其添加新项目, 我还尝试使 ObservableCollection 成为静态字段,我设法访问了主页中的集合,但在 AddNew 页面中更新集合后,我在主页中没有看到任何变化。

我认为问题是因为 MainPage 构造函数中的初始化语句,每次我导航到 AddNew 页面并更新集合然后导航回主页时,Constrctor 被调用并重置集合,所以解决方案是关于使 ObservableCollection 成为 golbal 变量并将其初始化在 MainPage 构造函数之外的某个地方, 或者,只需在事件处理程序中初始化集合,该处理程序仅在应用启动时执行一次。

所以我的问题是:1-有没有办法使全局可观察集合对应用程序中的每个页面都可见?如果是这样,我如何在绑定语句中引用它(x:Bind theGlobalCollection(或

2-是否有任何事件在应用程序生命周期中仅被触发一次?

对于这个大问题,我感到非常抱歉,感谢您的时间。

如何使全局属性在 Windows 10 应用的所有页面中可见

如果我理解正确,您可以简单地从构造函数中删除 instatiation 并将字段更改为:

public static ObservableCollection<Item> ItemsList = new ObservableCollection<Item>();

这样,项目列表仅实例化一次。

基于此站点,如果您希望ObservableCollection可以在 xaml 中进行数据绑定的所有视图,则可以使用 Application.Current.Resources 。有关详细信息,请参阅参考。

示例(来自源代码(:

public class PeopleViewModel : NotifyUIBase
{
    public ListCollectionView PeopleCollectionView {get; set;}
    private Person CurrentPerson
    {
        get { return PeopleCollectionView.CurrentItem as Person; }
        set
        {
            PeopleCollectionView.MoveCurrentTo(value);
            RaisePropertyChanged();
        }
    }
    public PeopleViewModel()
    {
        PeopleCollectionView = Application.Current.Resources["PeopleCollectionView"] as ListCollectionView;
        PeopleCollectionView.MoveCurrentToPosition(1);
    }
}