【问题标题】:WPF ReactiveUI bindings in View视图中的 WPF ReactiveUI 绑定
【发布时间】:2023-03-31 05:10:01
【问题描述】:

我正在使用 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 -> 视图绑定

【问题讨论】:

    标签: c# wpf xaml reactiveui rx.net


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        一个小例子:

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

        我希望这对你有帮助。

        问候。

        【讨论】:

        • 您还可以在 splat 依赖注入中为常见类型全局注册转换器,当您获得想要在其之间转换的常见类型时,它会变得非常强大。例如,默认注册的是布尔到可见性转换器,因此每次都不再有转换器。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多