Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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
Wpf MVVM模式过滤器listview和新项目更新_Wpf_Listview - Fatal编程技术网

Wpf MVVM模式过滤器listview和新项目更新

Wpf MVVM模式过滤器listview和新项目更新,wpf,listview,Wpf,Listview,我已经为这个问题挣扎了几天,但在某个地方我显然走错了方向。情况如下:我有一个窗口,有3个按钮:添加新任务、显示收件箱、显示今天和一个列表视图。我的TaskViewModel类具有TaskModel的ObservableCollection,具有非常简单的过滤器功能。我的班级情况如下: public class TaskViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler Property

我已经为这个问题挣扎了几天,但在某个地方我显然走错了方向。情况如下:我有一个窗口,有3个按钮:添加新任务、显示收件箱、显示今天和一个列表视图。我的TaskViewModel类具有TaskModel的ObservableCollection,具有非常简单的过滤器功能。我的班级情况如下:

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代码以加载备份字段。但它与备份字段一起工作吗?