【问题标题】:DataGrid Selected Item ReactiveUIDataGrid 选定项 ReactiveUI
【发布时间】:2015-08-25 15:23:26
【问题描述】:

我有一个 ReactiveList Books,并且能够使用响应式 UI 将其绑定到网格。 我正在尝试从数据网格中获取所选项目,以便进一步查询 BookService 以获取更多详细信息,并在不同的网格或数据网格本身的 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

}

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

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

但这对我不起作用。我是遗漏了什么还是我需要按照其他方式进行操作

【问题讨论】:

  • 这是错字还是您使用成员变量selectedBookName 而不是属性?
  • 不是错字,我将 Book.Name 分配给私有字段 selectedBookName

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


【解决方案1】:

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

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

如果你只想要书名,那么你可以使用SelectedValue

【讨论】:

    【解决方案2】:

    我看到了两个问题:

    1. 您实际上并未订阅正在侦听ReactiveList 更改的 Observable,因此您不会获得任何更新。您可能想要:

    this.WhenAnyObservable(x=>x.Books.ItemChanged).Subscribe(x => selectedBookName= ((Book)x).Name);
    
    1. 如果您分配给私有成员变量,那么您的ReactiveObject 永远不会知道绑定属性已更改。更有可能您的意思是 SelectedBookName = ((Book)x).Name); 请注意大写,因为如果您希望更改通知绑定,则应该分配给属性。

    【讨论】:

    • this.WhenAnyValue(x => x.Books.ItemChanged).Select(x => selectedBookName = ((Book)x).Name);解决了问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    相关资源
    最近更新 更多