Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 应用程序范围的可观察集合_C#_.net_Xaml_Windows 8_Microsoft Metro - Fatal编程技术网

C# 应用程序范围的可观察集合

C# 应用程序范围的可观察集合,c#,.net,xaml,windows-8,microsoft-metro,C#,.net,Xaml,Windows 8,Microsoft Metro,如果我将一个可观察的集合放在一个单独的.cs(class)文件中,并在MainPage.xaml中使用它,我如何使它能够使同一个可观察集合中存储的所有数据在以后从不同的xaml页面中访问 例如 MyClass.cs: 公共ObservableCollection oC=新ObservableCollection(); MainPage.xaml.cs: //添加到可观察集合 SecondPage.xaml.cs: //访问和使用存储在ObservableCollection中的数据 您可以将集合

如果我将一个
可观察的
集合放在一个单独的.cs(class)文件中,并在MainPage.xaml中使用它,我如何使它能够使同一个可观察集合中存储的所有数据在以后从不同的xaml页面中访问

例如

MyClass.cs:
公共ObservableCollection oC=新ObservableCollection();
MainPage.xaml.cs:
//添加到可观察集合
SecondPage.xaml.cs:
//访问和使用存储在ObservableCollection中的数据

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

或者实现单例模式

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

public ObservableCollection<String> Accessor
{
  get
  {
    return MyClass.oC;
  }
}
公共可观测集合访问器
{
得到
{
返回MyClass.oC;
}
}

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

或者实现单例模式

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

public ObservableCollection<String> Accessor
{
  get
  {
    return MyClass.oC;
  }
}
公共可观测集合访问器
{
得到
{
返回MyClass.oC;
}
}

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

e、 g

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


如果是这样的话,考虑另一种选择,或者使用锁定来确保单线程访问集合

。一种简单的方式是声明它是静态的,并且通过类型而不是实例访问它:

e、 g

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


如果是这样的话,考虑另一种选择,或者使用锁定来确保单线程访问集合

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

public class CollectionSrc
{
  public ObservableCollection<...> Col 
  { 
    get { return _col ?? (_col = new ObservableCollection<...>()); }
  }
}
现在,您可以在xaml代码中的任何地方访问
ColSrc
。例如

<ListBox ItemsSource={Binding Col, Source={StaticResource ColSrc}} />

像这样的东西怎么样。无处不在的资源

public class CollectionSrc
{
  public ObservableCollection<...> Col 
  { 
    get { return _col ?? (_col = new ObservableCollection<...>()); }
  }
}
现在,您可以在xaml代码中的任何地方访问
ColSrc
。例如

<ListBox ItemsSource={Binding Col, Source={StaticResource ColSrc}} />

我想你只是想要这个:

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

我希望这是有意义的

我想你只是想要这个:

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

我希望这是有意义的

谢谢@Charleh:)问这个问题有点尴尬。有时候我的记忆好像在休假。没必要感到尴尬,这是一个很好的问题。对于简单的项目,我喜欢静态类。我松散地将它们称为“服务”,如ProductService或PackageManager。他们做了所有的繁重工作,让我的ViewModels更苗条。如果项目变得更加复杂,并且发现服务开始依赖于其他服务,那么您可能会考虑移动到真正的IOC容器和依赖项注入。但是对于大多数简单的项目来说,静态类是一个很好的最小有效剂量。谢谢@Charleh:)问这个问题有点尴尬。有时候我的记忆好像在休假。没必要感到尴尬,这是一个很好的问题。对于简单的项目,我喜欢静态类。我松散地将它们称为“服务”,如ProductService或PackageManager。他们做了所有的繁重工作,让我的ViewModels更苗条。如果项目变得更加复杂,并且发现服务开始依赖于其他服务,那么您可能会考虑移动到真正的IOC容器和依赖项注入。但是对于大多数简单的项目,静态类是一个很好的最小有效剂量。这种模式适用于对其他服务没有任何依赖性的简单对象,并且您不需要控制它的创建时间(当Xaml解析器解析app.Xaml参考资料部分时,它总是在应用程序加载时创建)。如果您需要更多地控制对象的创建时间,或者需要提供依赖项,那么下面提到的单例和静态选项是更好的选择。因为问题是关于一个简单的可观察的收集,这个方法工作得很好。我认为在大多数情况下它是最好的选择。您可以将
CollectionSrc
重命名为
ViewModelLocator
,它会突然变得更加熟悉。然后,您还可以将其称为
ServiceLocator
,这样您就可以了解更多的模式。然后,您可以修改属性以使用某种IoC(控制反转)容器,以便检索该集合的方法更可自定义,并且您处于设计模式涅盘中。:)@JaredBienz MSFT嗯,我真的不明白你的意思。我还可以想象一个更复杂的物体,它表现出更复杂的行为。你能举一个我的建议不起作用的例子吗?另外一个优点是,我的解决方案也适用于较旧版本的SL,尽管现在它并不那么重要;o) @FilipSkakun有趣的一点。从未想过要将其用作访问ViewModels或服务的入口点。谢谢你的提示o) 此模式适用于对其他服务没有任何依赖关系且不需要控制其创建时间的简单对象(当Xaml解析器解析app.Xaml参考资料部分时,它将始终在应用程序加载时创建)。如果您需要更多地控制对象的创建时间,或者需要提供依赖项,那么下面提到的单例和静态选项是更好的选择。因为问题是关于一个简单的可观察的收集,这个方法工作得很好。我认为在大多数情况下它是最好的选择。您可以将
CollectionSrc
重命名为
V