View 中的 WPF ReactiveUI 绑定
WPF ReactiveUI bindings in View
我正在使用 Rx 和 ReactiveUI 创建一个 WPF 应用程序。我是否必须反应性地从代码隐藏视图中绑定属性,或者经典方法是否好?
我知道 View 和 ViewModel 对象之间的绑定,我只是想不通这些 xaml 绑定是否应该有不同的方式。
<Label x:Name="FilterLabel"
...
Width="{Binding ActualWidth, ElementName=TemplateLabel}"
.../>
这样可以吗还是有更多的"pro"方式?
this.WhenActivated(d => {
this.OneWayBind(ViewModel, vm => vm.Toolbar, v => v.ToolbarView.ViewModel).DisposeWith(d);
});
这就是我执行 ViewModel -> View 绑定的方式
如果您只是将视图 属性 绑定到 Xaml 中的另一个视图,那么在这种情况下您可以坚持使用 Xaml。但绝对坚持 View-ViewModel 绑定的代码隐藏,让你的 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";
}
希望对您有所帮助。
此致。
对于视图到视图的绑定,您可以在视图代码隐藏中使用以下语法:
this.WhenAnyValue(x => x.TemplateLabel.ActualWidth)
.BindTo(this, view => view.FilterLabel.Width)
.DisposeWith(disposable);
我正在使用 Rx 和 ReactiveUI 创建一个 WPF 应用程序。我是否必须反应性地从代码隐藏视图中绑定属性,或者经典方法是否好? 我知道 View 和 ViewModel 对象之间的绑定,我只是想不通这些 xaml 绑定是否应该有不同的方式。
<Label x:Name="FilterLabel"
...
Width="{Binding ActualWidth, ElementName=TemplateLabel}"
.../>
这样可以吗还是有更多的"pro"方式?
this.WhenActivated(d => {
this.OneWayBind(ViewModel, vm => vm.Toolbar, v => v.ToolbarView.ViewModel).DisposeWith(d);
});
这就是我执行 ViewModel -> View 绑定的方式
如果您只是将视图 属性 绑定到 Xaml 中的另一个视图,那么在这种情况下您可以坚持使用 Xaml。但绝对坚持 View-ViewModel 绑定的代码隐藏,让你的 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";
}
希望对您有所帮助。
此致。
对于视图到视图的绑定,您可以在视图代码隐藏中使用以下语法:
this.WhenAnyValue(x => x.TemplateLabel.ActualWidth)
.BindTo(this, view => view.FilterLabel.Width)
.DisposeWith(disposable);