我正在使用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->查看绑定的方式
答案 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);