我有一个ReactiveList Books,并能够使用响应式UI将其绑定到网格。我试图从datagrid中获取选中的项目,以便进一步查询BookService以获取更多详细信息,并在不同的网格或datagrid本身的行细节中显示详细信息。我的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
}
我试图获得选中的书的名称,并将其分配给视图模型的构造函数中的SelectedBookName。
this.WhenAnyObservable(x=>x.Books.ItemChanged).Select(x => selectedBookName= ((Book)x).Name);
但这对我不起作用。是我错过了什么,还是我需要遵循其他方式
还可以将数据网格SelectedItem
直接绑定到视图模型中的属性,该属性提供对整个对象的访问
this.Bind(ViewModel, x => x.SelectedBook, x => x.DataGridBooks.SelectedItem);
如果您只想要书名,那么您可以使用SelectedValue
我看到了两个问题:
- 你实际上并没有订阅正在监听
ReactiveList
变化的Observable,所以你不会得到任何更新。你可能想要:
this.WhenAnyObservable(x=>x.Books.ItemChanged).Subscribe(x => selectedBookName= ((Book)x).Name);
- 如果你分配给一个私有成员变量,那么你的
ReactiveObject
永远不会知道绑定属性已经改变。更有可能你的意思是做SelectedBookName = ((Book)x).Name);
注意大写,因为如果你想要更改通知绑定,你应该分配给属性。