6

我刚刚开始使用 MVVMCross,如果这似乎是一个简单的问题,请原谅我。我正在尝试在 WPF 中使用 MVVMCross Visibility 插件,此处提到:

https://github.com/MvvmCross/MvvmCross/wiki/Value-Converters

我安装了插件,并尝试按照以下步骤操作:

Windows - 如上所述使用本机包装器或西藏绑定:

Visibility="{Binding VMProperty, Converter={StaticResource Visibility}}"

当我尝试这样做时,它找不到资源“可见性”。

所以我想,我可以添加命名空间:

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>
{
}

...还是我错过了什么?文档似乎表明所涉及的工作较少。

4

1 回答 1

7

IValueConverter目前不是可移植的界面,这是微软深思熟虑的决定。我已经和 PCL 团队的一位成员谈过这个问题——他似乎很清楚,他们希望大多数价值转换器都是特定于平台的,因此不会坐在共享代码中。

正因为如此——并且因为 MvvmCross 相信许多值转换器将被共享——我们不得不IMvxValueConverter在 MvvmCross 中引入我们自己的接口。IMvxXAML 和 Microsoft 绑定不能直接使用此接口 - 这就是您当前需要“本机”包装的原因。

您可以通过使用 MvvmCross“西藏”绑定框架而不是 Microsoft 来解决此问题 - 如果您愿意的话,但我认为大多数基于 MS 的开发人员仍在使用 MS 绑定。


我错过了什么吗?文档似乎表明所涉及的工作较少。

对于在 Windows 上使用值转换器,wiki 说下面的文字 - 如果您认为这可以改进,请回馈更改 - 我们热衷于继续改进。

在 Windows 中使用值转换器(常规 Xaml 绑定)

该接口与Windows WPF 和 Silverlight Xaml 绑定中使用的IMvxValueConverter接口密切相关。IValueConverter此接口也与IValueConverterWindows WinRT Xaml 绑定中使用的接口相似(但略有不同)。

因为这些 XamlIValueConverter接口不是 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";
        } 
     }
    
  • 在您的 UI 项目中,使用MvxNativeValueConverter该类创建一个“本机”包装器:

     public class TheNativeTruthValueConverter
        : MvxNativeValueConverter<TheTruthValueConverter>
     {
     }
    
  • 在您的 Xaml 中,将您的 ValueConverter 实例包含为静态资源 - 这可以Resources在 App、Page 或 Control Xaml 级别完成,例如:

     <converters:TheNativeTruthValueConverter x:Key="TheTruth" />
    
  • 现在可以使用您的转换器 - 例如:

     <TextBlock Text="{Binding HasAccepted, Converter={StaticResource TheTruth}}" />
    

在 Windows 中使用值转换器(西藏绑定)

除了“传统的”Xaml 绑定之外,MvvmCross 还允许在 Windows 中进行“西藏”绑定——有关更多信息,请参阅wiki/Databinding

当使用西藏绑定时,可以通过名称访问值转换器 - 与 Droid 和 Touch 绑定中完全相同 - 无需上述原生 Xaml 包装。

此外,如果使用“西藏”绑定,则可以使用反射扫描技术注册整个程序集的值转换器,这可以在 Xaml 级别指定 - 这意味着它可以在设计和运行时使用。

若要在 Xaml 级别的程序集中包含所有值转换器,请使用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>
    
  • Foo完成此操作后,ValueConvertersBar将可在 'Tibet' 绑定中使用 - 例如:

     <TextBlock mvx:Bi.nd="Text Foo(Name)" />
    
于 2013-11-09T13:33:26.130 回答