Tag: #acticui

为什么Bind和OneWayBind始终不使用主UI线程?

在我的ViewModel我经常会ViewModel如下代码: public bool IsDownloading { get { return _isDownloading.Value; } } private ObservableAsPropertyHelper _isDownloading; … FileDownloader.WhenAny(x => x.IsDownloading, x => x.Value) .ToProperty(this, x => x.IsDownloading, out _isDownloading, false, RxApp.MainThreadScheduler); 注意最后一个RxApp.MainThreadScheduler参数 – 确保对IsDownloading属性的所有更新都发生在主UI线程上。 原因在于可能订阅它的原因。 例如,在我看来xaml我可能有以下代码: this.OneWayBind(ViewModel, x => x.IsDownloading, y => y.DownloadProgress.IsActive); 在这里,您会看到IsDownloading将被路由到控件上的IsActive项 – 因此任何更新都必须在UI线程上进行。 所以这一切都有效。 但我不明白为什么ReactiveUI是这样设计的。 看起来对于视图而不是VM来说,更新发生在UI线程上是很重要的,所以Bind或OneWayBind不应该确保它在正确的线程上吗? 事实上,如果你看一下这些例程的XML文档,他们会讨论将事物附加到View的,所以暗示它应该总是在主线程上。 那么:为什么OneWayBind和Bind不会隐式强制使用MainThread ? 我是否错过了ReactiveUI如何工作(或可以工作)?

ReactiveUI RaiseAndSetIfChanged是否为列表添加,删除,修改?

这会发火吗 private List _TweetTiles; public List TweetTiles { get { return _TweetTiles; } set { this.RaiseAndSetIfChanged(ref _TweetTiles, value); } } 当我做: TweetTiles.Add(new TweetTileViewModel(…)); or TweetTiles.Remove(new TweetTileViewModel(…)); 等等 我怀疑没有,但我不确定我应该如何得到这种行为。 我有一个函数,在后台任务上运行,即返回推文。 每次我收到一条新推文时,我都会将其转换为TweetTileViewModel,并希望它在我的UI列表框中显示。

ReactiveList和WhenAny

我在ReactiveLists中保存了一些具有ChangeTrackingEnabled = true的检查列表。 我想只在每个列表中至少检查一个项目时启用我的OkCommand。 此外,我还要确保使用有效的字节值填充各种其他属性。 我尝试过以下操作,但它不起作用: this.OkCommand = new ReactiveCommand(this.WhenAny( x => x.Property1, x => x.Property1, x => x.Property1, x => x.List1, x => x.List2, x => x.List3, (p1, p2, p3, l1, l2, l3) => { byte tmp; return byte.TryParse(p1.Value, out tmp) && byte.TryParse(p2.Value, out tmp) && byte.TryParse(p3.Value, out tmp) && l1.Value.Any(x => x.IsChecked) && […]