自动更新数据网格

自动更新数据网格

我使用此库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;
}

最佳答案

问题是可观察到的回调,包括修改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已订阅。

关于c# - 如何从IObservable <T>自动更新数据网格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49047128/

10-08 22:22