【发布时间】:2017-06-02 16:51:08
【问题描述】:
我有一个 ReactiveCommand 刷新数据并绑定到 XAML 中的按钮。该功能工作正常,但我也想在计时器上执行命令。
我有以下代码 - 从我的 VM 中的 ctor 调用 SetupAutoRefresh,但是当 Observable 触发时,我收到一条异常消息:“调用线程无法访问此对象,因为不同的线程拥有它。”
虚拟机:
private void SetupAutoRefresh() {
Observable.Timer(TimeSpan.FromSeconds(5))
.Select(_ => Unit.Default)
.ObserveOn(RxApp.MainThreadScheduler)
.InvokeCommand(RefreshData);
RefreshData = ReactiveCommand.CreateFromTask(Refresh);
}
private async Task Refresh()
{
var updatedData = await _repository.GetAll();
Data.Merge(updatedData);
}
private ReactiveCommand<Unit, Unit> _refreshData;
public ReactiveCommand<Unit, Unit> RefreshData
{
get { return _refreshData; }
set { this.RaiseAndSetIfChanged(ref _refreshData, value); }
}
private IReactiveList<Model> _data;
public IReactiveList<Model> Data
{
get { return _data; }
set { this.RaiseAndSetIfChanged(ref _data, value); }
}
XAML:
<Button Grid.Column="2"
Command="{Binding RefreshData}"
Style="{StaticResource ToolbarButtonTheme}"
Content="{StaticResource RefreshToolbarIcon}"
ToolTip="Refresh Search"/>
调试输出提供此堆栈跟踪:
在 System.Windows.Threading.Dispatcher.VerifyAccess() 在 System.Windows.DependencyObject.GetValue(DependencyProperty dp) 在 System.Windows.Controls.Primitives.ButtonBase.get_Command() 在 System.Windows.Controls.Primitives.ButtonBase.UpdateCanExecute() 在 System.Windows.Controls.Primitives.ButtonBase.OnCanExecuteChanged(对象 > 发件人,EventArgs e) 在 System.Windows.Input.CanExecuteChangedEventManager.HandlerSink.OnCanExecuteChanged(对象发送者,EventArgs e) 在 C:\projects\reactiveui\src\ReactiveUI\ReactiveCommand.cs:line 628 中的 ReactiveUI.ReactiveCommand.OnCanExecuteChanged() 处
我尝试了许多不同的变体,试图在 RxApp.MainThreadScheduler 上安排它,但没有任何乐趣 - ObserveOn、SubscribeOn、设置输出调度器......反正我对这些都没有太大希望。
感觉好像我在这里遗漏了一些明显的东西,但是整个下午我的头一直在撞砖墙上。这种情况在 RxUI 中肯定是可能的吗?
【问题讨论】:
标签: wpf reactiveui