我刚刚开始使用MVVMCross,请原谅我,如果这看起来像一个简单的问题。我正在尝试使用WPF中的MVVMCross Visibility插件,这里提到:
https://github.com/MvvmCross/MvvmCross/wiki/Value-Converters
我安装了该插件,并尝试按照以下步骤操作:
Windows - 如上所述使用Native包装器或Tibet Binding:
Visibility =“{Binding VMProperty,Converter = {StaticResource 能见度}}“
当我尝试这样做时,它找不到资源“可见性”。
所以我想,我可以添加名称空间:
xmlns:visibility="clr-namespace:Cirrious.MvvmCross.Plugins.Visibility;assembly=Cirrious.MvvmCross.Plugins.Visibility"
...然后将转换器添加到我的资源中:
<visibility:MvxVisibilityValueConverter x:Key="Visibility"></visibility:MvxVisibilityValueConverter>
...但现在我明白了:
“Cirrious.MvvmCross.Plugins.Visibility.MvxVisibilityValueConverter”类型的对象无法应用于需要“System.Windows.Data.IValueConverter”类型的属性。
我是否必须为此制作自己的转换器,如下所示:
class MyVisibilityConverter : MvxNativeValueConverter<MvxVisibilityValueConverter>
{
}
......或者我错过了什么?文档似乎表明涉及的工作较少。
答案 0 :(得分:7)
IValueConverter
目前不是便携式界面,这是微软的慎重决定。我和PCL团队的其中一个人谈过这个问题 - 他似乎非常清楚他们希望大多数价值转换器都是特定于平台的,所以不要坐在共享代码中。
正因为如此 - 并且因为MvvmCross相信会分享许多价值转换器 - 我们必须在MvvmCross中引入我们自己的IMvxValueConverter
接口。 XAML和Microsoft绑定不能直接使用此IMvx
接口 - 这就是您当前需要“本机”换行的原因。
你可以解决这个问题 - 如果你想 - 通过使用MvvmCross“Tibet”绑定框架而不是微软的框架,但我认为大多数基于MS的开发人员仍在使用MS绑定。
我错过了什么吗?文档似乎表明涉及的工作较少。
对于在Windows上使用值转换器,维基说下面的文字 - 如果您认为可以改进,请做出更改 - 我们渴望继续改进。
IMvxValueConverter
接口紧密基于Windows WPF和Silverlight Xaml绑定中使用的IValueConverter
接口。此接口与Windows WinRT Xaml绑定中使用的IValueConverter
接口类似(但略有不同)。
因为这些Xaml IValueConverter
接口彼此不是100%相同,也不是IMvxValueConverter
版本,所以共享Mvx ValueConverters不能直接在Windows Xaml绑定中使用 - 它们必须被包装以供使用在Xaml。
在每个Windows平台上执行此操作的步骤类似:
IMvxValueConverter
课程的,例如为了
public class TheTruthValueConverter
: MvxValueConverter<bool, string>
{
public string Convert(bool value, Type targetType, CultureInfo cultureInfo, object parameter)
{
return value ? "Yay" : "Nay";
}
}
,使用MvxNativeValueConverter
类创建一个“本机”包装器:
public class TheNativeTruthValueConverter
: MvxNativeValueConverter<TheTruthValueConverter>
{
}
将ValueConverter的实例包含为静态资源 - 这可以在App,Page或Control Xaml级别的Resources
中完成,例如:
<converters:TheNativeTruthValueConverter x:Key="TheTruth" />
现在您的转换器可以使用 - 例如:
<TextBlock Text="{Binding HasAccepted, Converter={StaticResource TheTruth}}" />
除了“传统的”Xaml绑定之外,MvvmCross还允许在Windows中绑定“Tibet” - 有关详细信息,请参阅wiki/Databinding。
当使用西藏绑定时,可以通过名称访问值转换器 - 与Droid和Touch绑定完全相同 - 没有上述本机Xaml包装。
此外,如果使用'Tibet'绑定,则可以使用反射扫描技术注册整个组件的价值转换器,这可以在Xaml级别指定 - 这意味着它可以在设计和运行时使用。
要在Xaml级别包含Assembly中的所有值转换器,请使用内部mvx:Import
属性的From
块,该属性包含该程序集中类的实例。
这可能听起来很复杂......但实际上它很简单。
MyTools
,FooValueConverter
等的大会BarValueConverter
public class MarkerClass {}
然后在xaml中,您可以包含一个静态资源导入块,如:
<mvx:Import x:Key="MvxAssemblyImport0">
<mvx:Import.From>
<myTools:MarkerClass />
<mvx:Import.From>
</mvx:Import>
完成此操作后,ValueConverters Foo
和Bar
将可用于“西藏”绑定 - 例如为:
<TextBlock mvx:Bi.nd="Text Foo(Name)" />