所以这就是我目前正在做的事情:
我有一个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线程中调度和添加可观察对象集合。