我正在重构我的应用程序以利用 MVVM。我曾经在可以将 ListView 绑定到的 Application 类中保留一个List<Product>
变量。这个列表构成了我的数据层。具有此 ListView 的页面是主/详细布局。使用 MVVM,我认为 List 现在应该包含 ProductModel 的实例,因为它是数据层。如果我应该绑定到 ViewModel,我是否也需要一个单独的 ViewModel 列表?
问问题
396 次
1 回答
1
您可能需要对 MVVM 采取不同的观点。您的视图是带有控件 (XAML) 的页面,而您的 ViewModel 是数据模型和页面之间的粘合剂。View 的整个数据上下文将设置为 ViewModel(直接在 XAML 中完成或在代码隐藏中完成,具体取决于您订阅的 MVVM 阵营)。
在您的示例中,您将移至List<Product>
ViewModelObservableCollection<Product>
并确保您的 ViewModel 实现 INotifyPropertyChanged 接口。INotifyPropertyChanged 是视图用来知道何时更新其绑定的合同。您将使用 anObservableCollection<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}
...
/>
于 2012-08-09T14:07:07.360 回答