使用 ReactiveUI 进行 Xaml 绑定时避免绑定错误

Avoiding binding errors when doing Xaml binding with ReactiveUI

我喜欢 ReactiveUI 基于代码的绑定机制。但是,有时您需要使用 XAML 绑定。在这些情况下,需要在 View 和 ViewModel 之间正确设置 DataContext。我一直在视图构造函数中这样做:

    public MyView()
    {
        InitializeComponent();

        this.WhenActivated(disposables =>
            {
                 this.DataContext = this.ViewModel;

                 ...
            });
    }

这有效,但我在运行时的输出 window 中收到错误:

System.Windows.Data Error: 40 : BindingExpression path error: ...

我正在使用 ReactiveUserControls、ViewModelViewHosts,并在定位器中注册 View/ViewModel 映射并让 ReactiveUI 解析它们。我想我会尽早设置 DataContext。因此,当我需要使用 XAML 绑定时 - 是否有另一种设置 DataContext 的方法来避免幻像调试输出错误?

你所拥有的问题是你永远不会自适应地获得新版本的 ViewModel,并且你可能会延迟订阅。

您最好考虑使用 WhenAnyValue() 运算符,例如:

this.WhenAnyValue(x => x.ViewModel).Bindto(this, x => x.DataContext);

考虑仍然在 WhenActivated() 中播放它,因为这样可以避免内存泄漏,否则请保留对 IDisposable 的引用并进行处理当您的视图已关闭时。