2015-08-20 59 views
0

所以这就是我目前做:如何使用IObservable <T>作为WPF源码绑定到ListBox的源码?

我有一个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事件处理程序的每个蜱;

Stream.Subscribe(TickHandler); 

TickHandler目前doigng这样的:

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

这里,从Rx流的每个输出Tick事件中,的ObservableCollection被更新,WPF GUI被通知需要进行的更改。

我会但是要做到,是列表框直接绑定到我的IObservable<string>流最好是在XAML。

我假设我不知何故必须使用行为来公开自定义IObservableItemsSource属性绑定IObservable<string>源消费。我想这将是这个样子到底:

IObservableItemsSource ="{Binding IObservableSource}" 

我知道如何实现的行为,但我不知道如何开始在XAML创建IObservable<string>财产的使用,或者如果这甚至有可能!

我的方式离谱吗?有人可以解释什么是最好的实现方式应该是什么?

谢谢。

+0

绑定不知道关于可观察到的杰克。你的假设是不正确的 - 你想提供[BindingBase]的实现(https://msdn.microsoft.com/en-us/library/system.windows.data.bindingbase(v = vs.110)。 aspx),它确实知道可观察的是什么。有一个ReactiveUI框架可以为你提供一个,但我不确定。我打赌它被称为* ObservableBinding *或类似的东西。 – Will

回答

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

+0

是的。我已经这样做了。然而,我想绑定到一个IObservable流反应扩展流。 – guerillacodester

+0

做到这一点的最好方法是从一个对象派生一个子类,然后为其他类实现一个接口。这样它会封装它。如果我正确理解你。 –

相关问题