代码之家  ›  专栏  ›  技术社区  ›  xeraphim

WPF MVVM Caliburn Micro-从另一个ViewModel通知ViewModel上的属性

  •  0
  • xeraphim  · 技术社区  · 10 年前

    我有两种观点

    • 概览视图: 包含绑定到IObservableCollection的数据网格(项目从构造函数中的存储库(xml文件)加载)

    • 添加视图: 包含一些文本框和向存储库添加项目的按钮

      我现在想要的是通知Overview视图的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);

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

    有更好/更漂亮/更干净的方法吗?

    提前感谢

    1 回复  |  直到 5 年前
        1
  •  1
  •   Nikita Shrivastava    10 年前

    仅在以下情况下加载列表 this.bookList 为空。 很可能,你会在里面填写bookList LoadBookList() . 因此,将getter修改为:

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

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

    推荐文章