带有西藏绑定的 MVVMCross WPF 值转换器不转换?
MVVMCross WPF Value Converter with Tibet Binding Is Not Converting?
我正在尝试制作一个值转换器,它采用 bool
和 returns 取反。值转换器本身很简单:
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 and have read 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>
在我的核心项目中,class ConverterMarker
是一个空的 public
class,紧挨着 App.cs
,如视频中所述。这是我认为应该使用此转换器的 class 行:
mvx:Bi.nd="Command SetStartingPointCommand; IsEnabled BoolNegation(UseDefaultStartingPoint)"/>
我认为在启动时注册此值转换器可能存在问题,所以我尝试添加:
protected override void FillValueConverters (IMvxValueConverterRegistry registry)
{
registry.AddOrOverwrite("BoolNegation", new BoolNegationValueConverter());
}
致我的 Setup
class,如值转换器维基页面中所述,但它告诉我 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
class 一样,所以这些方法都不能在我的 Setup.cs
class 中被覆盖。所以我所做的就是添加
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()
方法,但我检查过这会起作用。
我正在尝试制作一个值转换器,它采用 bool
和 returns 取反。值转换器本身很简单:
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 and have read 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>
在我的核心项目中,class ConverterMarker
是一个空的 public
class,紧挨着 App.cs
,如视频中所述。这是我认为应该使用此转换器的 class 行:
mvx:Bi.nd="Command SetStartingPointCommand; IsEnabled BoolNegation(UseDefaultStartingPoint)"/>
我认为在启动时注册此值转换器可能存在问题,所以我尝试添加:
protected override void FillValueConverters (IMvxValueConverterRegistry registry)
{
registry.AddOrOverwrite("BoolNegation", new BoolNegationValueConverter());
}
致我的 Setup
class,如值转换器维基页面中所述,但它告诉我 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
class 一样,所以这些方法都不能在我的 Setup.cs
class 中被覆盖。所以我所做的就是添加
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()
方法,但我检查过这会起作用。