我已将ReactiveList Orders绑定到wpf中的datagrid。 我通过遵循语法
成功获得了一个选定的订单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中多选择订单,我该如何获取所选项目?
答案 0 :(得分:3)
您的代码似乎无法执行您想要的操作,因为您似乎正在侦听ReactiveList ItemChanged observable(当数据源发生更改时将触发),当您要监视的是网格选择时。
虽然未经过测试,但以下代码似乎更符合您的目标(使用reactiveui-events助手):
// in the VM
public IList<Order> SelectedOrders { /* regular RxUI property as usual */ }
// in the view
this.Grid.Events().SelectionChanged
.Select(_ => this.Grid.SelectedItems.Cast<Order>().ToList())
.Subscribe(list => ViewModel.SelectedOrders = list);
我是否掌握了你想要达到的目标?
答案 1 :(得分:1)
根据Gluck提供的提示,我发现了一种通过在视图中为datagrid添加选择更改事件处理程序来获取所选订单集合的方法,如下所示
在ViewModel中添加反应属性
private IList<Order> selectedOrders;
public IList<Order> SelectedOrders
{
get
{
return selectedOrders;
}
set { this.RaiseAndSetIfChanged(ref selectedOrders, value); }
}
并在视图的代码隐藏
中private void OrdersGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ViewModel.SelectedOrders = OrdersGrid.SelectedItems.Cast<Order>().ToList();
}
答案 2 :(得分:1)
首先,您需要将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
中,将结果绑定到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;
}
}