具有西藏绑定的MVVMCross WPF值转换器未转换?

时间:2015-05-27 16:55:14

标签: wpf xaml mvvm mvvmcross valueconverter

我正在尝试创建一个取值为bool的值转换器并返回它的否定值。值转换器本身很简单:

namespace MyProject.Core.ValueConverters
{
using System;
using System.Globalization;
using Cirrious.CrossCore.Converters;

public class BoolNegationValueConverter : MvxValueConverter<bool, bool>
{
    protected override bool Convert(bool value, Type targetType, object parameter, CultureInfo culture)
    {
        return !value;
    }

    protected override bool ConvertBack(bool value, Type targetType, object parameter, CultureInfo culture)
    {
        return !value;
    }
}
}

我想使用此值转换器将按钮的IsEnabled属性绑定到bool。我正在使用描述here的西藏风格绑定并完整阅读this wiki page,以及观看n = 4和n = 35 MVVMCross视频。我在n = 35视频中跟随斯图尔特的解释,我生成的App.xaml文件看起来像这样:

<Application
x:Class="MyProject.WPF.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mvx="clr-namespace:mvx;assembly=Cirrious.MvvmCross.BindingEx.Wpf"
xmlns:core="clr-namespace:MyProject.Core;assembly=MyProject.Core"
StartupUri="MainWindow.xaml">
<Application.Resources>
    <ResourceDictionary>
        <mvx:Import
            x:Key="ImportCoreProject">
            <mvx:Import.From>
                <core:ConverterMarker />
            </mvx:Import.From>
        </mvx:Import>
    </ResourceDictionary>
</Application.Resources>
</Application>

课程ConverterMarker是一个空的public课程,位于我核心项目的App.cs旁边,如视频中所述。以下是我的视图类中应使用此转换器的行:

mvx:Bi.nd="Command SetStartingPointCommand; IsEnabled BoolNegation(UseDefaultStartingPoint)"/>

我想也许在启动时注册这个Value Converter会有问题,所以我尝试添加这个:

 protected override void FillValueConverters (IMvxValueConverterRegistry registry)
 {
     registry.AddOrOverwrite("BoolNegation", new BoolNegationValueConverter());
 }

到我的Setup课程,如值转换器维基页面中所述,但它告诉我there is no suitable method to override

如果有人能帮助我,我会非常感激。如果有帮助,无论发生什么事情都会使按钮永久禁用,无论UseDefaultStartingPoint的价值是多少。一切都在构建和运行,但按钮始终处于禁用状态。

提前谢谢!

1 个答案:

答案 0 :(得分:1)

debug输出告诉我failed to find combiner or converter for BoolNegation。我在MvxWpfSetup的源代码中注意到它不包含

protected virtual void RegisterBindingBuilderCallbacks() 

也不是

protected virtual void FillValueConverters(IMvxValueConverterRegistry registry)

就像MvxAndroidSetup类一样,所以这些方法都不能在我的Setup.cs类中被覆盖。所以我所做的就是添加

    protected void RegisterBindingbuilderCallbacks()
    {
        Mvx.CallbackWhenRegistered<IMvxValueConverterRegistry>(this.FillValueConverters);
    }

    protected void FillValueConverters(IMvxValueConverterRegistry registry)
    {
        registry.AddOrOverwrite("BoolNegation", new BoolNegationValueConverter());
    }

Setup.cs,也请编辑InitializeLastChance()

protected override void InitializeLastChance()
    {
        base.InitializeLastChance();

        var builder = new MvxWindowsBindingBuilder();
        this.RegisterBindingbuilderCallbacks();
        builder.DoRegistration();
    }

一切都很顺利。我将不得不手动将我想要的每个转换器添加到FillValueConverters()方法中,但这样可行,我查了一下。