在WPF中使用MvxVisibilityValueConverter

use*_*752 6 wpf mvvmcross

我刚刚开始使用MVVMCross,如果这看起来像一个简单的问题,请原谅我.我正在尝试使用WPF中的MVVMCross Visibility插件,这里提到:

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

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

Windows - 如上所述使用Native包装器或Tibet绑定:

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

当我尝试这样做时,它找不到资源"可见性".

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

xmlns:visibility="clr-namespace:Cirrious.MvvmCross.Plugins.Visibility;assembly=Cirrious.MvvmCross.Plugins.Visibility"
Run Code Online (Sandbox Code Playgroud)

...然后将转换器添加到我的资源:

<visibility:MvxVisibilityValueConverter x:Key="Visibility"></visibility:MvxVisibilityValueConverter>
Run Code Online (Sandbox Code Playgroud)

......但是现在我得到了:

类型为"Cirrious.MvvmCross.Plugins.Visibility.MvxVisibilityValueConverter"的对象不能应用于需要类型"System.Windows.Data.IValueConverter"的属性.

我是否必须为此制作自己的转换器,如下所示:

class MyVisibilityConverter : MvxNativeValueConverter<MvxVisibilityValueConverter>
{
}
Run Code Online (Sandbox Code Playgroud)

......或者我错过了什么?文档似乎表明涉及的工作较少.

Stu*_*art 7

IValueConverter目前还不是便携式界面,这是微软的一个深思熟虑的决定.我和PCL团队的其中一个人谈过这个问题 - 他似乎很清楚他们希望大多数价值转换器都是特定于平台的,所以不要坐在共享代码中.

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

你可以解决这个问题 - 如果你想 - 通过使用MvvmCross"Tibet"绑定框架而不是Microsoft的绑定框架,但我认为大多数基于MS的开发人员仍在使用MS绑定.


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

对于在Windows上使用值转换器,维基说下面的文字 - 如果你认为这可以改进,请做出贡献回来 - 我们渴望继续改进.

在Windows中使用值转换器(传统的Xaml绑定)

IMvxValueConverter接口紧密基于IValueConverterWindows WPF和Silverlight Xaml绑定中使用的接口.此接口与IValueConverterWindows WinRT Xaml绑定中使用的接口类似(但略有不同).

由于这些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";
        } 
     }
    
    Run Code Online (Sandbox Code Playgroud)
  • 在您的UI项目中,使用MvxNativeValueConverter该类创建一个"本机"包装器:

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

     <converters:TheNativeTruthValueConverter x:Key="TheTruth" />
    
    Run Code Online (Sandbox Code Playgroud)
  • 现在您的转换器可以使用 - 例如:

     <TextBlock Text="{Binding HasAccepted, Converter={StaticResource TheTruth}}" />
    
    Run Code Online (Sandbox Code Playgroud)

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

除了"传统的"Xaml绑定之外,MvvmCross还允许在Windows中绑定"Tibet" - 有关更多信息,请参阅wiki/Databinding.

当使用西藏绑定时,可以通过名称访问值转换器 - 与Droid和Touch绑定完全相同 - 没有上述本机Xaml包装.

此外,如果使用"Tibet"绑定,则可以使用反射扫描技术注册整个组件的值转换器,这可以在Xaml级别指定 - 这意味着它可以在设计和运行时使用.

要在Xaml级别包含Assembly中的所有值转换器,请使用mvx:Import具有inner From属性的块,该属性包含该Assembly中的类的实例.

这可能听起来很复杂......但实际上它很简单.

  • 假设你有一个大会MyToolsFooValueConverter,BarValueConverter
  • 在这个大会中添加一个简单的,可实现的公共类,我们将仅用于导入 - 例如 public class MarkerClass {}
  • 然后在xaml中,您可以包含一个静态资源导入块,如:

     <mvx:Import x:Key="MvxAssemblyImport0">
       <mvx:Import.From>
         <myTools:MarkerClass />
       <mvx:Import.From>
     </mvx:Import>
    
    Run Code Online (Sandbox Code Playgroud)
  • 完成上述操作后,那么ValueConverters FooBar将可用于在"西藏"绑定使用-例如作为:

     <TextBlock mvx:Bi.nd="Text Foo(Name)" />
    
    Run Code Online (Sandbox Code Playgroud)