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