我有一个带有ReactiveUI的简单演示应用程序:
//in the viewmodel
class MainViewModel : ReactiveObject
{
public ReactiveUI.ReactiveCommand<Unit, Unit> MyReactiveCommand { get; }
public MainViewModel()
{
MyReactiveCommand = ReactiveCommand.Create(() => { MessageBox.Show("Hello"); }, outputScheduler: RxApp.MainThreadScheduler);
}
}
在XAML视图中
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<Grid>
<WrapPanel HorizontalAlignment = "Left">
<Button Content="button" Command="{Binding MyReactiveCommand}"/>
</WrapPanel>
</Grid>
当您按下按钮时,应该有一个消息框,但出现以下错误:
System.InvalidOperationException:'调用线程无法访问 该对象,因为其他线程拥有它。'
我尝试返回一个值,然后按照Glenn的建议进行订阅,但这存在相同的问题。至少使用此代码,消息框会在崩溃前打开;)
public class MainViewModel : ReactiveObject
{
public ReactiveCommand<Unit, Unit> MyReactiveCommand { get; }
public MainViewModel()
{
MyReactiveCommand = ReactiveCommand.CreateFromObservable(DoSometing);
MyReactiveCommand.Subscribe(x => { MessageBox.Show("Hello"); });
}
public IObservable<Unit> DoSometing()
{
return Observable.Start(() => { });
}
}
答案 0 :(得分:1)
所以要注意几件事。 ReactiveCommand.CreateFromObservable
有一个名为outputScheduler
的参数,这将是订阅服务器的输出所要到达的位置。您可以在此处传递RxApp.MainThreadScheduler
。
public class MainViewModel : ReactiveObject
{
public ReactiveCommand<Unit, Unit> MyReactiveCommand { get; }
public MainViewModel()
{
MyReactiveCommand = ReactiveCommand.CreateFromObservable(DoSometing, outputScheduler: RxApp.MainThreadScheduler);
MyReactiveCommand.Subscribe(x => { MessageBox.Show("Hello"); });
}
public IObservable<Unit> DoSometing()
{
return Observable.Start(() => { });
}
}
请注意,请确保已安装NuGet软件包ReactiveUI.WPF