如何使用 IObservable<T> 作为 WPF 源绑定到列表框的源?



所以这就是我目前正在做的事情:

我有一个WPF列表框,当前数据绑定并由

填充
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}"

我知道如何实现行为,但我不知道如何开始创建一个IObservable<string>属性在xaml中使用,或者如果这是可能的!

我错了吗?有人能解释一下实现这一点的最佳方式是什么吗?

谢谢。

Observable Collection实现了INotifyCollectionChanged,它会提醒xaml需要更新视图。所以,如果你只是添加到集合,因为你正在做它应该更新UI自动只要你正确地绑定到ViewModel。

这是视图

        <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线程中调度和添加可观察对象集合。

相关内容

  • 没有找到相关文章

最新更新