1

如果我将一个ObservableCollection 放在一个单独的 .cs (类)文件中并在我的MainPage.xaml中使用它,我该如何制作它以便稍后可以从不同的 XAML 页面中访问存储在同一个 Observable Collection 中的所有数据时间?

例如

MyClass.cs:
public ObservableCollection<String> oC = new ObservableCollection<String>();

MainPage.xaml.cs:
// add to observable collection

SecondPage.xaml.cs:
// access and use data stored in ObservableCollection
4

4 回答 4

3

您可以将集合声明为静态成员。

或者实现单例模式。

当您在 XAML 中绑定到集合时,您需要在视图模型中创建一个访问器。

public ObservableCollection<String> Accessor
{
  get
  {
    return MyClass.oC;
  }
}
于 2013-02-18T13:37:24.783 回答
2

一种简单的方法是将其声明为静态并通过类型而不是实例访问它:

例如

class SomeClass 
{
    public static bool SomeBool = false;
}

class SomeOtherClass
{
    public void SomeMethod() 
    {
        Debug.Write(SomeClass.SomeBool); // Ouput = false
    }
}

请记住,这个 observable 将是静态的,因此是单个实例 - 对它的任何修改都将立即对所有访问它的对象可见 - 这意味着如果某些代码正在迭代 observable 而另一个尝试添加/删除它 - 迭代器会抛出异常

如果是这种情况,请考虑替代方案或使用锁定来确保对集合的单线程访问

于 2013-02-18T13:37:50.773 回答
2

那么这样的事情怎么样。无处不在的资源...

public class CollectionSrc
{
  public ObservableCollection<...> Col 
  { 
    get { return _col ?? (_col = new ObservableCollection<...>()); }
  }
}

App.xaml

<ns:CollectionSrc x:Key="ColSrc" /> <!--ns .. the namespace of CollectionSrc-->

现在您可以访问ColSrcxaml 代码中的任何位置。例如

<ListBox ItemsSource={Binding Col, Source={StaticResource ColSrc}} />
于 2013-02-18T13:41:10.373 回答
0

我想你只是想要这个:

MyClass.cs:
public static ObservableCollection<String> oC = new ObservableCollection<String>();

MainPage.xaml.cs:
// add to observable collection

SecondPage.xaml.cs:
// access and use data stored in ObservableCollection

一旦它oC是静态的,您就可以从任何类/页面一次又一次地引用它。

但是,如果您想绑定到它(因为您无法绑定到 Windows 8 应用程序中的字段或静态属性),您需要让该 XAML 页面在一个简单的属性中引用您的静态属性:

SecondPage.xaml.cs:
public static ObservableCollection<String> oC { get { return MyClass.oC; } }

我希望这是有道理的!

于 2013-02-18T18:50:42.583 回答