[英]WPF ReactiveUI bindings in View
我正在使用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绑定的方法
如果您只是将视图属性绑定到Xaml中的另一个属性,那么在这种情况下您可以坚持使用Xaml。 但是肯定坚持View-ViewModel绑定的代码隐藏,保持你的Xaml文件更清洁,你也可以通过使用C#绑定获得类型检查的好处。
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";
}
我希望这可以帮助你。
问候。
对于查看绑定的视图,您可以在View代码隐藏中使用以下语法:
this.WhenAnyValue(x => x.TemplateLabel.ActualWidth)
.BindTo(this, view => view.FilterLabel.Width)
.DisposeWith(disposable);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.