我正在尝试创建一个取值为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
的价值是多少。一切都在构建和运行,但按钮始终处于禁用状态。
提前谢谢!
答案 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()
方法中,但这样可行,我查了一下。