View 中的 WPF ReactiveUI 绑定

WPF ReactiveUI bindings in View

我正在使用 Rx 和 ReactiveUI 创建一个 WPF 应用程序。我是否必须反应性地从代码隐藏视图中绑定属性,或者经典方法是否好? 我知道 View 和 ViewModel 对象之间的绑定,我只是想不通这些 xaml 绑定是否应该有不同的方式。

<Label x:Name="FilterLabel"
   ...
   Width="{Binding ActualWidth, ElementName=TemplateLabel}"
   .../>

这样可以吗还是有更多的"pro"方式?

this.WhenActivated(d => {
    this.OneWayBind(ViewModel, vm => vm.Toolbar,   v => v.ToolbarView.ViewModel).DisposeWith(d);
});

这就是我执行 ViewModel -> View 绑定的方式

如果您只是将视图 属性 绑定到 Xaml 中的另一个视图,那么在这种情况下您可以坚持使用 Xaml。但绝对坚持 View-ViewModel 绑定的代码隐藏,让你的 Xaml 文件更干净,你还可以通过使用 C# 绑定获得类型检查的好处。

XAML 绑定适用于简单的用例,但对于更复杂的情况,您肯定应该使用代码隐藏绑定,例如,代码隐藏绑定为您提供了一个选择器功能,您可以使用这个强大的功能来制作你的 ViewModels 更简单。

一个小例子:

this.WhenActivated(disposables =>
        {

            this.OneWayBind(ViewModel, vm => vm.UserRole,
                v => v.UserRole.Text, GetAbreviatedRole).DisposeWith(disposables);
        });

在这种情况下,GetAbreviatedRole 是一个选择器,它可以节省您使用值转换器的时间。

private string GetAbreviatedRole(string role)
    {
        if (role.Equals("SuperUser", StringComparison.OrdinalIgnoreCase))
            return "SU";
        if (role.Equals("BuildingManager", StringComparison.OrdinalIgnoreCase))
            return "BM";
        if (role.Equals("OfficeManager", StringComparison.OrdinalIgnoreCase))
            return "OM";
        if (role.Equals("OfficeManagerJunior", StringComparison.OrdinalIgnoreCase))
            return "OMJ";
        if (role.Equals("Usuario", StringComparison.OrdinalIgnoreCase))
            return "U";
        return "unknown";
    }

希望对您有所帮助。

此致。

对于视图到视图的绑定,您可以在视图代码隐藏中使用以下语法:

this.WhenAnyValue(x => x.TemplateLabel.ActualWidth)
    .BindTo(this, view => view.FilterLabel.Width)
    .DisposeWith(disposable);