如何从IObservable <t>自动更新datagrid

时间:2018-03-01 10:01:59

标签: c# wpf data-binding

我使用此库https://github.com/step-up-labs/firebase-database-dotnet从firebase检索项目,然后实时将其显示到datagrid。

但是我在显示它时遇到困难,根据上面的链接获得实时流媒体,我需要使用此代码:

var firebase = new FirebaseClient("https://dinosaur-facts.firebaseio.com/");
var observable = firebase
  .Child("dinosaurs")
  .AsObservable<Dinosaur>()
  .Subscribe(d => Console.WriteLine(d.Key));

我尝试使用此代码,但gridview上没有显示任何内容:

var observable = firebase
    .Child("news/item")
    .AsObservable<News>();

disposable = observable.Subscribe();

dataGrid.ItemsSource = observable.AsObservableCollection();

我也试试这个没有运气:

private ObservableCollection<News> _myItems = new ObservableCollection<News>();
private IEnumerable<News> MyNews { get { return _myItems; } }

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    var observable= firebase
        .Child("news/item")
        .AsObservable<News>();

    _myItems = observable.AsObservableCollection();

    disposable = observable.Subscribe();

    dataGrid.ItemsSource = MyNews;
}

2 个答案:

答案 0 :(得分:2)

问题是可观察的回调,包括修改ObservableCollection返回的AsObservableCollection,默认情况下在线程池线程上运行。但是你不能在非UI线程上修改ObservableCollection,因此存在被吞下的异常。所以相反,这样做:

var observable = firebase
      .Child("news/item")
      .AsObservable<News>();            
dataGrid.ItemsSource = observable
    .ObserveOnDispatcher() // < key point
    .AsObservableCollection();

请勿忘记安装nuget包System.Reactive.Windows.Threading并添加using System.Reactive.Linq;以访问ObserveOnDispatcher扩展方法。

也不需要致电observable.Subscribe();,除非您需要其他东西。 AsObservableCollection已订阅。

答案 1 :(得分:0)

@Evk,但是O​​bserveOnDispatcher()或datagrid存在问题

我已经在这篇文章中描述了这个问题:

ObserveOnDispatcher duplicates records