Wpf MVVM模式过滤器listview和新项目更新
我已经为这个问题挣扎了几天,但在某个地方我显然走错了方向。情况如下:我有一个窗口,有3个按钮:添加新任务、显示收件箱、显示今天和一个列表视图。我的TaskViewModel类具有TaskModel的ObservableCollection,具有非常简单的过滤器功能。我的班级情况如下:Wpf MVVM模式过滤器listview和新项目更新,wpf,listview,Wpf,Listview,我已经为这个问题挣扎了几天,但在某个地方我显然走错了方向。情况如下:我有一个窗口,有3个按钮:添加新任务、显示收件箱、显示今天和一个列表视图。我的TaskViewModel类具有TaskModel的ObservableCollection,具有非常简单的过滤器功能。我的班级情况如下: public class TaskViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler Property
public class TaskViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public ObservableCollection<TaskModel> TaskCollection { get; private set; }
public TaskViewModel()
{
TaskDataAccess ac = new TaskDataAccess();
this.TaskCollection = ac.GetAllTasks();
}
public ICommand AddTaskCommand
{
get { return new DelegateCommand(this.AddTask); }
}
public ICommand FilterInboxCommand
{
get { return new DelegateCommand(this.FilterInbox); }
}
public void AddTask()
{
this.TaskCollection.Add(new TaskModel(9, "I", "New Item for testing"));
this.GetListCollectionView().Filter = this.IsInbox; ;
}
private void FilterInbox()
{
this.GetListCollectionView().Filter = this.IsInbox;
}
....
}
过滤器功能工作正常,但当我调用“新建”窗口“添加新任务”时,它不会在此处更新列表视图:this.TaskCollection.Addnew TaskModel9,I,new Item for testing
如果有人能给我一个提示,我将不胜感激……试着这样做
创建一个私有字段,例如_taskCollection,以备份属性taskCollection
private readonly ObservableCollection<TaskModel> _taskCollection;
然后从TaskCollection属性中删除专用setter。还要删除加载集合的构造函数代码
private readonly ObservableCollection<TaskModel> _taskCollection;
相反,这样写你的getter
public ObservableCollection<TaskModel> TaskCollection {
get {
if (this._taskCollection == null)
{
TaskDataAccess ac = new TaskDataAccess();
this._taskCollection = ac.GetAllTasks();
}
return this._taskCollection;
}
}
让我知道这种方法是否有效……1。listview如何绑定到集合?2.如果临时禁用筛选器,它是否工作?它直接绑定ViewModel类:ListView Name=LstTask ItemsSource={Binding Path=TaskCollection}。在窗口构造函数中,我说:this.DataContext=newtaskviewmodel;使用以下命令调用新条目窗口:TaskAdd add=new TaskAdd;添加.ShowDialog;好的,你能在AddTask上设置一个断点看看它是否真的被执行了吗?是的,它被执行了。当我调试到private bool IsInboxobject obj中时,我能够看到新添加的项,但视图没有显示该项:附加信息:如果我注释掉行:this.TaskCollection.Addnew TaskModel9,I,用于测试的新项;然后单击AddTask窗口中的save(保存)按钮。它不会刷新Listview,但该过程已执行。也许您可以尝试在AddTask内调用OnPropertyChangedTaskCollection?它会在AddTask中引发NullReferenceException。我认为,由于新表单addtask\u taskCollection是空的。因此,它再次执行数据库中的ac.GetAllTasks,这正是我想要的omitted@Adam,您是否尝试实施备份收集字段,但是?可能是getter代码可能不正确,您可以重新引入constructir代码以加载备份字段。但它与备份字段一起工作吗?