0

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

4

1 回答 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 回答