所以这就是我当前做的事情:
我有一个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中使用,或者甚至可以这样做!
我离开了标记吗?有人能解释一下实现这个的最佳方法应该是什么?
感谢。
答案 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集合。