ViewModel中的ObservableCollection,Model中的List

6

我很难找到一种解决方法,来解决需要维护两个列表的问题。

我正在使用MVVM,但不想让我的模型使用ObservableCollection。我认为这是最好的封装方式,可以让我使用不同的视图/模式(例如控制台)。而不是像这样设置我的结构:

public class MainWindow {
  // handled in XAML file, no code in the .cs file
}

public abstract class ViewModelBase : INotifyPropertyChanged {
  // handles typical functions of a viewmodel base class
}

public class MainWindowViewModel : ViewModelBaseClass {
  public ObservableCollection<Account> accounts { get; private set; }
}

public class Administrator {
  public List<Account> accounts { get; set; }

  public void AddAccount(string username, string password) {
    // blah blah
  }
}

在上述情况下,我希望避免有两个不同的集合/列表。我只想让模型处理数据,而ViewModel负责其呈现的逻辑。


看起来你需要在管理员类上有删除/添加/编辑事件,并让你的MainWindowViewModel观察这些更改。 - kenny
好的,那就是它的实现方式,但是现在我需要能够绑定到“管理员”列表,并在添加、删除或编辑时更新它。 - keelerjr12
1个回答

8
您可以在您的Viewmodel中使用一个ICollectionView来展示您的Model数据。
public class MainWindowViewModel : ViewModelBaseClass {
 public ICollectionView accounts { get; private set; }
 private Administrator _admin;

  //ctor
  public MainWindowViewModel()
  {
     _admin = new Administrator();
     this.accounts  = CollectionViewSource.GetDefaultView(this._admin.accounts);
  }

  //subscribe to your model changes and call Refresh
  this.accounts.Refresh();

xaml

  <ListBox ItemsSource="{Binding accounts}" />

请注意,常见的命名标准使用PascalCasing来命名属性。在使用CollectionViewSource时,请使用+1。 - default

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接