DataGrid选择项目ReactiveUI

时间:2015-08-25 15:23:26

标签: c# wpf system.reactive reactive-programming reactiveui

我有一个ReactiveList Books,并且能够使用反应式UI将其绑定到网格。 我正在尝试从datagrid获取所选项目,以便我进一步查询BookService以获取更多详细信息,并在datagrid本身的不同网格或rowdetail中显示详细信息。 我的ViewModel具有以下属性

    private ReactiveList<Book> books;
    public ReactiveList<Book> Books
    {
        get
        {
            return books;
        }
        set 
        { 
            this.RaiseAndSetIfChanged(ref books, value); 
        }
    }
    private string selectedBookName;
    public string SelectedBookName
    {
        get
        {
            return selectedBookName;
        }
        set
        {
            this.RaiseAndSetIfChanged(ref selectedBookName, value);
        }
    }

Book对象如下所示

public class Book
{
public string Name{get;set;}
public decimal Price{get;set;}
.
.
.//other properties

}

我试图获取所选书籍的名称,并将其分配给viewmodel构造函数中的SelectedBookName。

this.WhenAnyObservable(x=>x.Books.ItemChanged).Select(x => selectedBookName= ((Book)x).Name);

但这对我没有用。我错过了什么,或者我需要遵循其他方式

2 个答案:

答案 0 :(得分:2)

还可以将数据网格SelectedItem直接绑定到视图模型中的属性,该模型提供对整个对象的访问权限

this.Bind(ViewModel, x => x.SelectedBook, x => x.DataGridBooks.SelectedItem);

如果只想要书名,则可以使用SelectedValue

答案 1 :(得分:0)

我看到两个问题:

  1. 您实际上并未订阅正在侦听ReactiveList更改的Observable,因此您不会获得任何更新。你可能想要:
  2. this.WhenAnyObservable(x=>x.Books.ItemChanged).Subscribe(x => selectedBookName= ((Book)x).Name);
    
    1. 如果您要分配私有成员变量,那么您的ReactiveObject永远不会知道绑定属性已更改。您更有可能做SelectedBookName = ((Book)x).Name);注意大写,因为如果您希望更改通知绑定,您应该分配给该属性。