Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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# 如何通过viewmodel库访问所有viewmodels?_C#_Wpf_Mvvm - Fatal编程技术网

C# 如何通过viewmodel库访问所有viewmodels?

C# 如何通过viewmodel库访问所有viewmodels?,c#,wpf,mvvm,C#,Wpf,Mvvm,我已经创建了一个ViewModel类,该类在INotifyPropertyChanged的实现中包含,现在我还有其他从ViewModel(基本)继承的ViewModel。 实际上一切都很好,但我有一个疑问。 假设我在CustomService模型中有一个称为Price的可观察集合,如下所示: private ObservableCollection<Models.Price> _price = new ObservableCollection<Models.Price>(

我已经创建了一个ViewModel类,该类在INotifyPropertyChanged的实现中包含,现在我还有其他从ViewModel(基本)继承的ViewModel。 实际上一切都很好,但我有一个疑问。 假设我在CustomService模型中有一个称为Price的可观察集合,如下所示:

private ObservableCollection<Models.Price> _price = new ObservableCollection<Models.Price>();
public ObservableCollection<Models.Price> Price
{
     get { return _price; }
}
因此,将所有childs虚拟机导入到base中,并通过ViewModel.Instance.Price访问它们


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

通过此实现,您可以将同一数据源共享给所有ViewModels

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

    }
公共类价格生成器{
私人价格生成器(){
此。价格=新的可观察集合();
这个.Generate();
}
void生成(){
//在此处生成对象
this.Prices.Add(generatedPrice);
}
公众可观察到的集合价格{
得到;
}
私有静态PriceGenerator_实例;
公共静态PriceGenerator实例=>\u实例??(\u实例=新PriceGenerator());
}

通常有两种方法

  • 即使您没有真正的数据库/存储库,也要实现一个模拟这种情况的单例类。此单例类还应实现
    INotifyPropertyChanged
    (和/或
    INotifyCollectionChanged
    )。所有ViewModels都将能够访问此模拟存储库,感兴趣的ViewModels可以选择订阅此存储库的
    PropertyChanged
    回调。对于您的问题,通常使用一个只处理价格的存储库比使用一个存储101种不同信息的模拟存储库更整洁
  • 有一个主视图模型。有些人会设想,
    main窗口
    是主视图,具有相应的主视图模型。此ViewModel故意设置为一个单例,其他ViewModel可以通过静态调用访问它。这个主视图模型基本上就像#1一样工作——它就像一个存储101个不同信息的存储库。主视图模型看起来可能不整洁,但它只是用来跟踪东西的存储位置——如果您需要任何数据,它可能就在那里

  • 就个人而言,我更喜欢使用第一种方法。是这种方法的一个例子。虽然他的“存储库”不仅仅是存储数据。

    你的价格来自哪里?如果是数据库,请考虑实现RepositotyPattern并使您的存储库成为Singleton@lokusking没有数据库。只需在代码后面填充数据,然后使生成器auchsingleton@lokusking但是我不明白如何通过viewModel.Instance.price从基本viewModel访问CustomerViewModel的属性背后的想法是,您有一个全局类,从该类可以访问生成的对象
    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());
    
        }