我正在使用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";
}
我希望这对你有帮助。
谨致问候。