视图中的WPF ReactiveUI绑定

时间:2018-08-01 11:19:55

标签: c# wpf xaml reactiveui rx.net

我正在使用Rx和ReactiveUI创建WPF应用程序。我是否必须在代码后面被动地绑定视图中的属性,还是经典方法好? 我知道View和ViewModel对象之间的绑定,但是我无法弄清楚这些xaml绑定是否应该有其他方法。

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

这样还可以吗?或者还有其他“亲”方法吗?

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

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

3 个答案:

答案 0 :(得分:1)

如果您只是将View属性绑定到Xaml中的另一个属性,那么在这种情况下,您可以坚持使用Xaml。但是一定要坚持使用View-ViewModel绑定的代码隐藏功能,使您的Xaml文件更整洁,并且还可以使用C#绑定获得类型检查的好处。

答案 1 :(得分:1)

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";
    }

希望这对您有所帮助。

致谢。

答案 2 :(得分:1)

对于要查看绑定的视图,您可以在“隐藏”视图的代码内部使用以下语法:

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