WPF MVVM Caliburn Micro - 从另一个ViewModel

时间:2015-09-02 08:42:47

标签: c# .net wpf mvvm

我有两个观点

  • 概述 - 视图:包含绑定到IObservableCollection的数据网格(项目从构造函数中的存储库(xml文件)加载)
  • 添加视图:包含一些文本框和一个将项添加到存储库的按钮

      

    我现在想要的是通知概述视图的IObservableCollection项目已添加到xml文件中。

我的第一次尝试如下:

public IObservableCollection<Book> BookList
{
    get
    {
        this.LoadBookList();
        return this.bookList;
    }
    set
    {
        this.bookList = value;
        this.NotifyOfPropertyChange(() => this.BookList);
    }
}

this.LoadBookList()从存储库初始化this.bookList

这当然有效(该项目已添加到xml文件中,因此存储库可以获取并设置书单),但存在以下问题:

我在数据网格的每一行都有一个Delete-Button,绑定到DeleteItem(Book book)

public void DeleteItem(Book book)
{
    var bookToRemove = this.BookList.Single(b => b.Equals(book));
    this.BookList.Remove(bookToRemove);

    this.BookRepository.WriteBookList(this.BookList);
}

但是通过this.LoadBookList(); - 属性中的BookList调用,当调用this.BookRepository.WriteBookList(this.BookList);

时,列表会再次填充存储库中的所有项目

一种解决方案是在this.bookList - 方法中使用支持属性DeleteItem(...) ......但这是正确的方法吗?

是否有更好/更漂亮/更清洁的方法?

提前致谢

1 个答案:

答案 0 :(得分:1)

仅在this.bookList为空时加载列表。 最有可能的是,您将在LoadBookList()内填写bookList。 因此,将getter修改为:

if(this.bookList==null)
        this.LoadBookList();
 return this.bookList;

注意:在LoadBookList()中初始化booklist。