如何使用IObservable <t>作为绑定到ListBox的WPF源的源?

时间:2015-08-20 15:12:18

标签: wpf data-binding system.reactive

所以这就是我当前做的事情:

我有一个WPF ListBox,当前数据以

为界限并填充
public ObservableCollection<string> SourceBinding
{
  get;
  set;
}

这个WPF有界源有一个OnCollectionChanged事件处理程序,无论何时添加新项目都会执行以下操作;

ObservableCollection<string> source = new ObservableCollection<String>();

private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    NotifyPropertyChanged("NotifyPropertyChanged")
}

我还订阅了一个IObservable<string>流,它通过TickHHandler事件处理程序处理每个tick;

Stream.Subscribe(TickHandler);

TickHandler目前正在执行此操作:

    private void TestSubscription( string item)
    {
        sourceBinding.Add(item)            
    }

这里,对于来自Rx流的每个输出tick事件,更新ObservableCollection并通知WPF GUI需要进行的更改。

喜欢 要做的是将ListBox直接绑定到我的IObservable<string>流,最好是在xaml内。

我假设我不得不使用行为来公开自定义IObservableItemsSource属性以绑定IObservable<string>源以供使用。我想最终会看起来像这样:

IObservableItemsSource ="{Binding IObservableSource}"

我知道如何实现行为,但我不知道如何开始创建{x 1}}属性以便在xaml中使用,或者甚至可以这样做!

我离开了标记吗?有人能解释一下实现这个的最佳方法应该是什么?

感谢。

1 个答案:

答案 0 :(得分:0)

Observable Collection实现了INotifyCollectionChanged,它将警告xaml它需要更新视图。因此,如果您只是添加到集合中,只要您将其正确绑定到ViewModel,就应该自动更新UI。

这是视图

        <ListBox ItemsSource="{Binding Collection}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Label Content="{Binding}" />
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

这是

背后的代码
    public class ViewModel
    {
        public ObservableCollection<string> Collection { get; set; }

    }
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            var vm = new ViewModel();
            vm.Collection = new ObservableCollection<string>();
            this.DataContext = vm;
            vm.Collection.Add("Item");
            vm.Collection.Add("Item");
            vm.Collection.Add("Item");
            vm.Collection.Add("Item");
            vm.Collection.Add("Item");


        }

请注意,只要您在UI线程中进行处理,您就可以使用它。如果您在后台线程中执行此操作,则需要调度并添加到UI线程中的observable集合。