【问题标题】:How to make a global property that is visible within all pages in a Windows 10 app?如何使全局属性在 Windows 10 应用程序的所有页面中可见?
【发布时间】:2016-02-07 22:06:14
【问题描述】:

我正在考虑一个代表商店的应用程序,我正在使用 GridView 来查看项目,并且数据表示为 ObservableCollection。

我的 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>

MainPage 中的 C# 代码:

public sealed partial class MainPage : Page
{
    public ObservableCollection<Item> ItemsList;

    public MainPage()
    {
        this.InitializeComponent();

        ItemsList = new ObservableCollection<Item>(); 
    }
}

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

我认为问题在于 MainPage Constructor 中的初始化语句,每次我导航到 AddNew 页面并更新 Collection 然后导航回 MainPage 时,都会调用 Constrctor 并重置 Collection,所以解决方案是让 ObservableCollection 成为一个全局变量并在 MainPage 构造函数之外的某个地方对其进行初始化,或者只是在应用启动时仅执行一次的事件处理程序中初始化 Collection。

所以我的问题是: 1-有没有办法让应用程序中的每个页面都可以看到全局 ObservableCollection ?如果是这样,我如何在绑定语句中引用它(x:Bind theGlobalCollection)或

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

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

【问题讨论】:

    标签: c# xaml windows-10 uwp windows-10-universal


    【解决方案1】:

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

    public static ObservableCollection&lt;Item&gt; ItemsList = new ObservableCollection&lt;Item&gt;();

    这样,ItemsList只被实例化一次。

    【讨论】:

      【解决方案2】:

      基于这个site,如果您想要一个ObservableCollection 用于可以在xaml 中数据绑定的所有视图,您可以使用Application.Current.Resources。如需更多信息,请参阅reference

      示例(来自来源):

      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);
          }
      }
      

      【讨论】:

      • 这似乎有效,但实际上 Xerillio 的回答完成了工作,感谢您抽出宝贵的时间,我真的很感激。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      • 2018-08-05
      • 2016-12-23
      • 2017-02-06
      • 1970-01-01
      • 2019-12-02
      • 1970-01-01
      相关资源
      最近更新 更多