使用 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)"