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