使用MVVM Pattern在ViewModel中验证绑定的ObservableCollection

cle*_*ing 5 c# wpf mvvm

我是MVVM的新手,刚刚在MVVM模式之后开始了我的第一个项目.我尝试使用IDataErrorInfo接口验证ObservableCollection时遇到问题.我的ObservableCollection看起来像这样:

ObservableCollection<Magazine> magazineRepository;
    public ObservableCollection<Magazine> MagazineRepository
    {
        get { return magazineRepository; }
        set
        {
            if (value != null)
            {
                bladRepository = value;
                OnPropertyChanged("MagazineRepository");
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的XAML是这样的:

<ListBox x:Name="listMagazineRepository"
                 Grid.ColumnSpan="2"
                 ItemsSource="{Binding}" 
                 DataContext="{Binding MagazineRepository}"
                 DisplayMemberPath="Navn" 
                 SelectedItem="{Binding Path=SelectedItem}"/>

        <TextBox x:Name="txtName" Grid.Row="1" Grid.Column="0"
                    Text="{Binding ElementName=listMagazineRepository, Path=SelectedItem.Navn, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" />
        <TextBox x:Name="txtPrice" Grid.Row="2" Grid.Column="0"
                    Text="{Binding ElementName=listMagazineRepository, Path=SelectedItem.Pris, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" />
Run Code Online (Sandbox Code Playgroud)

它只是一个包含对象的简单列表框,当您选择一个项目时,所选对象属性将显示在文本框中,然后绑定到列表框对象.

我的问题是,当我像这样设置代码时,我能够弄清楚如何验证我的数据的唯一方法是在域模型中,这实际上不是一个好习惯,我想在ViewModel中验证在它到达之前.基本上我想验证MagazineRepository中的每个属性,在ViewModel中,你会怎么做呢?

PS:如果我的问题缺乏信息,我很想在这个主板(以及一般的编程板)上发帖,请告诉我,我将提供所需的详细信息.

非常感谢.

Dte*_*tex 3

如果我理解正确的话,您想验证 Magazine 对象。如果是这种情况,一种方法是将该类包装在视图模型中,我们称之为 MagazineVM,它实现 IDataErrorInfo 并保持杂志对象更新。然后您将视图绑定到 MagazineVM 列表。举一个非常简单的例子:

public class MagazineVM : IDataErrorInfo, INotifyPropertyChanged
{
   private Magazine _magazine;

   public int FirstMagazineProperty
   {
      get { return _magazine.FirstMagazineProperty; }
      set { _magazine.FirstMagazineProperty = value; RaisePropertyChanged("FirstMagazineProperty"); }
   }

   //INotifyPropertyChanged implementation

   //IDataErrorInfo implementation
}
Run Code Online (Sandbox Code Playgroud)