WPF中的ReactiveCommand引发带订阅异常

时间:2019-07-17 08:23:33

标签: data-binding reactiveui

我有一个带有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(() => { });
    }
}

1 个答案:

答案 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