我正在尝试制作一个值转换器,它需要一个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
。我正在使用这里描述的西藏风格绑定,并完整地阅读了这个wiki页面,并观看了n=4和n=35 MVVMCross视频。我按照Stuart的解释在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)"/>
我想也许在启动时注册这个值转换器有问题,所以我试着添加这个:
protected override void FillValueConverters (IMvxValueConverterRegistry registry)
{
registry.AddOrOverwrite("BoolNegation", new BoolNegationValueConverter());
}
到我的Setup
类,如值转换器wiki页面所述,但它告诉我there is no suitable method to override
.
UseDefaultStartingPoint
的值是多少。一切都在构建和运行,但按钮总是被禁用。
提前感谢!
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()
方法的每个转换器,但这将起作用,我检查了。