2015-08-20 101 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

做到這一點的最好方法是從一個對象派生一個子類,然後爲其他類實現一個接口。這樣它會封裝它。如果我正確理解你。 –

相關問題