Skip to main content
 首页 » 编程设计

c#之使用 ReactiveUI 从 ReactiveList 获取所选项目集合

2024年02月05日50cyq1162

我已经将 ReactiveList Orders 绑定(bind)到 wpf 中的数据网格。 我通过以下语法成功获得了单个选定订单

private Order _selectedOrder; 
public Order SelectedOrder 
{ 
    get { return _selectedOrder; } 
    set { this.RaiseAndSetIfChanged(ref _selectedOrder, value); } 
} 
this.WhenAnyValue(x => x.Orders.ItemChanged).Select(x => _selectedOrder = ((Order)x)); 

但是如果我在 datagrid 中多选订单,我如何获得选中的项目?

请您参考如下方法:

首先,您需要将 EventPattern 转换为 IObservable。你可以使用这样的东西来做到这一点:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Reactive.Linq; 
using System.Windows.Controls; 
 
namespace System.Windows.Controls.Extensions 
{ 
    public static class ListBoxExtensions 
    { 
        public static IObservable<List<T>> SelectionChanged<T>(this ListBox listBox) 
        { 
            return Observable.FromEventPattern<SelectionChangedEventHandler, SelectionChangedEventArgs>( 
                eh => listBox.SelectionChanged += eh, 
                eh => listBox.SelectionChanged -= eh) 
                .Select(_ => listBox.SelectedItems.Cast<T>().ToList()); 
        } 
    } 
} 

然后在您的 Control 中,将结果绑定(bind)到 ViewModel,如下所示:

    public partial class MyControl : UserControl, IViewFor<MyViewModel> 
    { 
        public MyControl() 
        { 
            InitializeComponent(); 
 
            this.WhenActivated(d => 
            { 
                MyListView.SelectionChanged<MyItemViewModel>() 
                    .Do(list => ViewModel.SelectedItems = list) 
                    .SubscribeOn(RxApp.MainThreadScheduler) 
                    .ObserveOn(RxApp.MainThreadScheduler) 
                    .Subscribe() 
                    .DisposeWith(d); 
            }); 
        } 
 
        object IViewFor.ViewModel 
        { 
            get => ViewModel; 
            set => ViewModel = value as MyViewModel; 
        } 
 
        public MyViewModel ViewModel 
        { 
            get => DataContext as MyViewModel; 
            set => DataContext = value; 
        } 
    }