使用 ReactiveUI 从 ReactiveList 获取选定项目集合

nav*_*ule 3 .net c# wpf reactive-programming reactiveui

我已将 ReactiveList Orders 绑定到 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));
Run Code Online (Sandbox Code Playgroud)

但是,如果我在数据网格中多次选择订单,如何获取所选项目?

Mov*_*GP0 6

首先,您需要将 转换EventPatternIObservable. 你可以使用这样的方法来做到这一点:

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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在您的 中Control,将结果绑定到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;
        }
    }
Run Code Online (Sandbox Code Playgroud)