如何将ListView SelectedItem转换为IObservable?

时间:2015-05-08 03:43:40

标签: c# xaml listview system.reactive reactive-programming

这可能是一个补救问题,但我的研究现在正在转动我(特别是作为Java开发人员)并查看几个不同的Rx包装器库。我想要的只是取ListView<MusicNote>.SelectedItem并将其包装成IObservable,发出当前单个选定值的流。这样做最简单的方法是什么?我应该使用ReactiveProperty,Rx-XAML还是某些库?或者有一个简单的内置方法来使用Rx.NET做到这一点?我宁愿不使用VS生成的传统事件方法存根。虽然我可以推动它的价值,但它感觉很乱,并不是我想要的范例。

this.keySelector.SelectedItem // turn this ListView's SelectedItem into an IObservable

2 个答案:

答案 0 :(得分:1)

在Rx.Net中执行此操作的一种方法如下:

var whenSelectionChange = Observable.FromEventPattern(h => listView.SelectedIndexChanged += h, 
                                                      h => listView.SelectedIndexChanged -= h)
                                    .Select(_ => listView.SelectedItem);

基本上,FromEventPattern()从ListView触发的SelectedIndexChanged事件生成可观察序列。每次触发事件时都会调用Select(),因此您可以从列表中获取所选索引并将其返回。 whenSelectionChange将是IObservable<int>,其中每个添加的元素都是新选择的索引。

我从未使用它,但您可以查看http://reactiveui.net/这是一个MVVM框架,似乎与RX.Net很好地集成,并且在所有移动平台上都支持它。

答案 1 :(得分:0)

感谢您的帮助。这最终是我最终做的。虽然我最初并不想这样做,但它似乎是最简单的。这是我工作的最终成果https://goo.gl/HTF3zd

        private readonly ReplaySubject<TuningChangeEvent> tuningChange = new ReplaySubject<TuningChangeEvent>();


        private void OneTuner_ValueChanged(object sender, RangeBaseValueChangedEventArgs e) {
           tuningChange.OnNext(TuningChangeEvent.tune(1,Convert.ToInt32(OneTuner.Value)));
        }