如何通过viewmodel base访问所有视图模型?

时间:2016-06-26 16:56:10

标签: c# wpf mvvm

我已经在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访问它们;

但对我来说似乎不是一个好习惯。有什么想法吗?

2 个答案:

答案 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)

通常有两种方法。

  1. 即使您没有真正的数据库/存储库,也要实现一个模拟这个的单例类。这个单例类还应该实现INotifyPropertyChanged(和/或INotifyCollectionChanged。所有ViewModel都能够访问此模拟存储库,感兴趣的ViewModel可以选择订阅此存储库的PropertyChanged回调。对于您的问题,拥有一个处理只是价格的存储库通常更整洁,而不是拥有存储101种不同信息的模拟存储库。
  2. 拥有一个主ViewModel。有些人会想象MainWindow是主视图,并使用相应的主ViewModel。这个ViewModel有意成为一个单例,其他ViewModel可以通过静态调用访问。这个主要的ViewModel基本上就像#1一样 - 它就像一个存储101个不同信息的存储库。那个主要的ViewModel可能看起来不整洁,但它只是追踪存储的东西 - 如果你需要任何数据,它可能就在那里。
  3. 就个人而言,我更喜欢使用第一种方法。 lokusking's answer就是这种方法的一个例子。虽然他的“存储库”不仅仅是存储数据。