开发者

MVVM pattern filter listview and update on new item

开发者 https://www.devze.com 2023-03-21 01:07 出处:网络
I\'ve been struggling with this problem for a couple of days, but somewhere I obviously on a wrong track. Situation is as follows: I have a window with 3 buttons (Add New Task, Show Inbox, Show Today)

I've been struggling with this problem for a couple of days, but somewhere I obviously on a wrong track. Situation is as follows: I have a window with 3 buttons (Add New Task, Show Inbox, Show Today) and a Listview. My TaskViewModel class is has a ObservableCollection of TaskModel, with pretty simple Filter functionality. My class looks as follows:

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
    {
    开发者_Go百科    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;
    }

   ....
}

The filter functionality works fine, but when I call the new window "Add new task" it does not update the listview (here: this.TaskCollection.Add(new TaskModel(9, "I", "New Item for testing"));

I'd appreciate if someone could give me a hint...


Try to do this...

create a private field (say _taskCollection) to backup your property TaskCollection.

private readonly ObservableCollection<TaskModel> _taskCollection;

Then remove the private setter from TaskCollection property. Also remove the constructor code that loads the collection.

Instead write your getter this way...

public ObservableCollection<TaskModel> TaskCollection {
get {
    if (this._taskCollection == null)
    {
        TaskDataAccess ac = new TaskDataAccess();
        this._taskCollection = ac.GetAllTasks();
    }

    return this._taskCollection;
}

}

Let me know if this way works ....

0

精彩评论

暂无评论...
验证码 换一张
取 消