使用 MvvmCross,如何获得布尔值的 "opposite" 绑定?
Using MvvmCross, how do I get an "opposite" binding for a bool?
在我的特定应用程序中,当 IsSelected 为 false 时,我希望背景是透明的,即 Transparent = true。我怀疑我必须写一个转换器,但也许有更简单的方法?
set.Bind(selectedBox).For(v => v.Transparent).To(vm => vm.IsSelected).OneWay();
看起来有 WithConversion<...> 的可能性。也许我需要一个 NotValueConverter?很难相信这还没有在某处实施....
更新。 我将以下内容添加到我的核心
public class NotConverter : MvxValueConverter<bool, bool>
{
protected override bool Convert(bool value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return !value;
}
protected override bool ConvertBack(bool value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return !value;
}
}
不过好像没有被扫一扫和
set.Bind(selectedBox).For(v => v.Transparent).To(vm => vm.IsSelected).WithConversion("Not").OneWay();
没有任何区别。
转换器需要以 ValueConverter
结尾才能被 MvvmCross 自动拾取。您还可以使用泛型来使用 WithConversion
.
set.Bind(selectedBox).For(v => v.Transparent).To(vm => vm.IsSelected).WithConversion<NotConverter>().OneWay();
我以为 "Not" 是一个内置转换器,我在 Android 上使用过它,但到目前为止我找不到任何东西。
我对此很好奇,所以我开始查看 MvvmCross 代码。在 Android 上,您可以执行以下操作:
app:MvxBind="Enabled !SomeBoolean"
有效,但实际上是 MvxInvertedValueCombiner
在执行此操作,而不是任何 ValueConverter
。所以在流利的形式中,这应该可以解决问题:
set.Bind(selectedBox).For(v => v.Transparent).ByCombining(new MvxInvertedValueCombiner(), vm => vm.IsSelected)
实际上我从来没有以这种方式使用过它,但它似乎有效。此外,值组合器似乎在任何值转换器之前应用,所以假设你已经厌倦了 MvxInvertedVisibilityValueConverter
,你可以在 Android:
上做这样的事情
app:MvxBind="Visibility Visibility(!HideMe)"
在我的特定应用程序中,当 IsSelected 为 false 时,我希望背景是透明的,即 Transparent = true。我怀疑我必须写一个转换器,但也许有更简单的方法?
set.Bind(selectedBox).For(v => v.Transparent).To(vm => vm.IsSelected).OneWay();
看起来有 WithConversion<...> 的可能性。也许我需要一个 NotValueConverter?很难相信这还没有在某处实施....
更新。 我将以下内容添加到我的核心
public class NotConverter : MvxValueConverter<bool, bool>
{
protected override bool Convert(bool value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return !value;
}
protected override bool ConvertBack(bool value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return !value;
}
}
不过好像没有被扫一扫和
set.Bind(selectedBox).For(v => v.Transparent).To(vm => vm.IsSelected).WithConversion("Not").OneWay();
没有任何区别。
转换器需要以 ValueConverter
结尾才能被 MvvmCross 自动拾取。您还可以使用泛型来使用 WithConversion
.
set.Bind(selectedBox).For(v => v.Transparent).To(vm => vm.IsSelected).WithConversion<NotConverter>().OneWay();
我以为 "Not" 是一个内置转换器,我在 Android 上使用过它,但到目前为止我找不到任何东西。
我对此很好奇,所以我开始查看 MvvmCross 代码。在 Android 上,您可以执行以下操作:
app:MvxBind="Enabled !SomeBoolean"
有效,但实际上是 MvxInvertedValueCombiner
在执行此操作,而不是任何 ValueConverter
。所以在流利的形式中,这应该可以解决问题:
set.Bind(selectedBox).For(v => v.Transparent).ByCombining(new MvxInvertedValueCombiner(), vm => vm.IsSelected)
实际上我从来没有以这种方式使用过它,但它似乎有效。此外,值组合器似乎在任何值转换器之前应用,所以假设你已经厌倦了 MvxInvertedVisibilityValueConverter
,你可以在 Android:
app:MvxBind="Visibility Visibility(!HideMe)"