Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ViewModel中的ObservableCollection,模型中的列表_C#_Wpf_Xaml - Fatal编程技术网

C# ViewModel中的ObservableCollection,模型中的列表

C# ViewModel中的ObservableCollection,模型中的列表,c#,wpf,xaml,C#,Wpf,Xaml,我正在努力找到一个解决方案,来解决必须维护两个列表的问题 我正在使用MVVM,但不希望我的模型使用ObservableCollection。我觉得这是最好的封装,并允许我使用不同的视图/模式(例如控制台)。而不是像这样设置我的结构: public class MainWindow { // handled in XAML file, no code in the .cs file } public abstract class ViewModelBase : INotifyProperty

我正在努力找到一个解决方案,来解决必须维护两个列表的问题

我正在使用
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
  }
}
公共类主窗口{
//在XAML文件中处理,.cs文件中没有代码
}
公共抽象类ViewModelBase:INotifyPropertyChanged{
//处理viewmodel基类的典型函数
}
公共类MainWindowViewModel:ViewModelBaseClass{
公共可观测集合帐户{get;private set;}
}
公共类管理员{
公共列表帐户{get;set;}
public void AddAccount(字符串用户名、字符串密码){
//废话
}
}

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

您可以在ViewModel中使用ICollectionView来显示模型数据

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



听起来您需要在管理员类上设置删除/添加/编辑事件,并让MainWindowViewModel观察这些更改。对,这就是它的实现方式,但我不需要绑定到Administrator中的列表,并在添加、删除内容时对其进行更新,或已编辑。+1用于CollectionViewSource。请注意,通用命名标准用于属性。
  <ListBox ItemsSource="{Binding accounts}" />