2013-01-07 67 views
2

我最近开始试图弄到似乎还没有工作的MVVM。MVVM模式,ViewModel集合

我有我的模型,视图和ViewModels。我有一个使用INotifyPropertyChanged接口的baseview模型。

我想收集我的ViewModels,这样我就可以在我的所有视图中使用我的数据。但我似乎无法完成这一切。

无论如何,在阅读大量不同的东西后,我甚至不知道应该是什么。

我希望有人能回答我的最大问题是我在哪里转储我的ViewModels收藏?我需要在View中更改一个ViewModel,并在另一个中再次显示它。

public class BaseViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public BaseViewModel() 
    { 

    } 

    protected virtual void RaisePropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = this.PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

这是一个的填充在一个视图中ViewModel,则需要在另一个视图显示。但我不知道如何完成ObservableCollection<T>课程。

public class WorkViewModel : BaseViewModel 
{ 
    private string reference; 
    private string address; 
    private string scope; 
    private string cost; 
    private double amount; 
    private double gst; 
    private double total; 

    public string Reference 
    { 
     get { return reference; } 
     set 
     { 
      if (reference != value) 
      { reference = value; RaisePropertyChanged("Reference"); } 
     } 
    } 

    public string Address 
    { 
     get { return address; } 
     set 
     { 
      if (address != value) 
      { address = value; RaisePropertyChanged("Address"); } 
     } 
    } 

    public string Scope 
    { 
     get { return scope; } 
     set 
     { 
      if (scope != value) 
      { scope = value; RaisePropertyChanged("Scope"); } 
     } 
    } 

    public string Cost 
    { 
     get { return cost; } 
     set 
     { 
      if (cost != value) 
      { cost = value; RaisePropertyChanged("Cost"); } 
     } 
    } 

    public double Amount 
    { 
     get { return amount; } 
     set 
     { 
      if (amount != value) 
      { 
       amount = value; 
       GST = Math.Round(amount * 0.10,2); 
       RaisePropertyChanged("Amount"); 
      } 
     } 
    } 

    public double GST 
    { 
     get { return gst; } 
     set 
     { 
      if (gst != value) 
      { 
       gst = value; 
       Total = Math.Round(Amount + GST,2); 
       RaisePropertyChanged("GST"); 
      } 
     } 
    } 

    public double Total 
    { 
     get { return total; } 
     set 
     { 
      if (total != value) 
      { 
       total = value; 
       RaisePropertyChanged("Total"); 
      } 
     } 
    } 

} 

我已经试过这样:就像我需要做一个单身

Tab1ViewModel vm = (ViewModels.Where(vm => vm is Tab1ViewModel).Count() == 0) ? new Tab1ViewModel(): (ViewModels.Where(vm => vm is Tab1ViewModel).FirstOrDefault() as Tab1ViewModel;" 

看来:

"Create a BaseViewModel and a Collection ObservableCollection<BaseViewModel> _viewModels; 

Create a Property ObservableCollection<BaseViewModel> ViewModels around _viewModels 

Define your View Models like this and add to Collection 

MainViewModel : BaseViewModel 

Tab1ViewModel : BaseViewModel 

Tab2ViewModel : BaseViewModel 

现在你可以使用这个?

+2

请添加一个例子,有问题的代码... – Blachshma

+0

2个字:卡利微 –

回答

2

您不应该在设计中的任何位置存储视图模型的集合。在我看来,你的视图模型应该使用来自支持源的数据(很可能是你的模型)。在该设计中,您应该能够实例化相同类型的2个视图模型,并且他们都会看到相同的数据,因为它们使用相同的基础数据。我对每个视图总是有1个视图模型实例,并且它不与其他任何视图共享。

+0

这就是我后我,但显然我没有做正确的 – WordPressGuy

+0

+1本文描述了一种在模型中可观察到的集合代表什么由两个不同的观点模型: http://www.codeproject.com/Articles/28802/Item-Level-Presentation-Models-for-WPF – HappyNomad