MVVM - 模型和视图模型的数据层

时间:2012-08-09 13:56:30

标签: silverlight data-binding mvvm

我正在重构我的应用程序以利用MVVM。我曾经在Application类中保留一个List<Product>变量,我能够将ListView绑定到。此列表组成了我的数据层。具有此ListView的页面是主/详细布局。使用MVVM,我认为List现在应该包含ProductModel的实例,因为它是数据层。如果我应该绑定到ViewModels,我是否还需要一个单独的ViewModel列表?

1 个答案:

答案 0 :(得分:1)

您可能需要对MVVM采取不同的观点。您的View是包含控件的页面(XAML),ViewModel是数据模型和页面之间的粘合剂。 View的整个数据上下文将被设置为ViewModel(可以直接在XAML中完成,也可以在代码隐藏中完成,具体取决于您订阅的MVVM阵营)。

在您的示例中,您将List<Product>作为ObservableCollection<Product>移动到ViewModel上,并确保您的ViewModel实现了INotifyPropertyChanged接口。 INotifyPropertyChanged是View用来知道何时更新它的绑定的契约。您将使用ObservableCollection<T>而不是列表,因为ObservableCollection<T>实现了INotifyPropertyChanged。

您的View的DataContext属性将设置为ViewModel的实例。在View上,ListBox控件的ItemsSource属性将设置为绑定到Product集合。然后,您可以在ViewModel中包含负责与数据存储通信以填充可观察集合的方法。

视图模型

public class MyViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private ObservableCollection<Product> _products = null;
    public ObservableCollection<Product> Products
    {
       get { return _products; }
       set
       {
           if( _products != value )
           {
               _products = value;

               if( this.PropertyChanged != null )
               {
                   this.PropertyChanged( this, new PropertyChangedEventArgs( "Products" ) );
                }
            }
        }
     }

     // have code in here that loads the Products list from your data store (i.e. service call to database)
}

查看代码背后

public MyView()
{   
    InitializeComponent(); 
    this.DataContext = new MyViewModel();
}

视图

<ListBox
    ItemsSource={Binding Path=Products, Mode=OneWay}
    SelectedItem={Binding Path=SelectedProduct, Mode=TwoWay}
    ...
/>