我已经在INotifyPropertyChanged的实现中创建了一个ViewModel类,现在我还有其他从ViewModel(base)继承的ViewModel。 实际上一切都很好,但我怀疑。 所以,让我们在CustomerViewModel中说一个名为Price的ObservableCollection,就像这样:
private ObservableCollection<Models.Price> _price = new ObservableCollection<Models.Price>();
public ObservableCollection<Models.Price> Price
{
get { return _price; }
}
这个ObservableCollection应该由其他类填充,因为我需要访问相同的资源。
我真的不明白我怎么能在mvvm中这样做。我虽然使用Singleton ViewModel,所以在基本VM中定义了这样的东西:
public static ViewModel Instance { get; set; }
因此,将所有子VM导入基础并通过ViewModel.Instance.Price访问它们;
但对我来说似乎不是一个好习惯。有什么想法吗?
答案 0 :(得分:1)
通过此实现,您可以将相同的数据源共享到所有ViewModel
public class PriceGenerator {
private PriceGenerator() {
this.Prices = new ObservableCollection<Price>();
this.Generate();
}
void Generate() {
//Generate Objects here
this.Prices.Add(generatedPrice);
}
public ObservableCollection<Price> Prices {
get;
}
private static PriceGenerator _instance;
public static PriceGenerator Instance => _instance ?? (_instance = new PriceGenerator());
}
答案 1 :(得分:0)
通常有两种方法。
INotifyPropertyChanged
(和/或INotifyCollectionChanged
。所有ViewModel都能够访问此模拟存储库,感兴趣的ViewModel可以选择订阅此存储库的PropertyChanged
回调。对于您的问题,拥有一个处理只是价格的存储库通常更整洁,而不是拥有存储101种不同信息的模拟存储库。MainWindow
是主视图,并使用相应的主ViewModel。这个ViewModel有意成为一个单例,其他ViewModel可以通过静态调用访问。这个主要的ViewModel基本上就像#1一样 - 它就像一个存储101个不同信息的存储库。那个主要的ViewModel可能看起来不整洁,但它只是追踪存储的东西 - 如果你需要任何数据,它可能就在那里。就个人而言,我更喜欢使用第一种方法。 lokusking's answer就是这种方法的一个例子。虽然他的“存储库”不仅仅是存储数据。