视图中的WPF ReactiveUI绑定



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

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

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

如果您只是将一个视图属性绑定到Xaml中的另一个,那么在这种情况下,您可以使用Xaml。但一定要坚持使用ViewViewModel绑定的代码隐藏,保持您的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";
}

我希望这对你有帮助。

谨致问候。

相关内容

  • 没有找到相关文章

最新更新