MVVMCross WPF ValueConverter具有无效的转换

问题描述

我正在尝试将前景色绑定到WPF文本块。

按照MvvmCross文档的指示,视图模型中的属性是一种颜色:

private System.Drawing.Color _setValueColor;

        public System.Drawing.Color SetValueColor
        {
            get { return _setValueColor == null ? System.Drawing.Color.Green : _setValueColor; }
            set { SetProperty(ref _setValueColor,value); }
        }

xaml文本块是

    <TextBlock Grid.Column="3" Grid.Row="1" Margin="20"
           Text="{Binding SetMessage}" Foreground="{Binding SetValueColor,Converter={StaticResource NativeColor}}">
    </TextBlock>

我有一个引用该插件的资源字典resource.xaml文件。该插件以nu-get MvvmCross.Plugin.Color 7.1.2的形式安装

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:color="clr-namespace:MvvmCross.Plugin.Color;assembly=MvvmCross.Plugin.Color" 
    <color:MvxNativeColorValueConverter x:Key="NativeColor"  />
</ResourceDictionary>

在视图上,我将资源添加到构造器中

public SimpleReadWriteView()
        {
            var resourceDict = new System.Windows.ResourceDictionary();
            resourceDict.source = new Uri("Resource.xaml",UriKind.Relative);
            Resources.MergedDictionaries.Add(resourceDict);
            InitializeComponent();
        }

运行时会引发强制转换错误

InvalidCastException:无法转换类型的对象 'MvvmCross.Plugin.Color.MvxnativeColorValueConverter'键入 “ System.Windows.Data.IValueConverter”。

我还尝试通过继承MvxValueConverter来创建自己的转换器,并且遇到相同类型的转换错误,无法将转换器转换为System.Windows.Data.IValueConverter类型。

解决方法

请勿在WPF应用程序中使用System.Drawing.Color,它是WinForms类型。请改用System.Windows.Media.Color

private System.Windows.Media.Color setValueColor = System.Windows.Media.Colors.Green;

public System.Windows.Media.Color SetValueColor
{
    get { return setValueColor; }
    set { SetProperty(ref setValueColor,value); }
}

您不需要绑定转换器。您可以改为直接绑定Color的{​​{1}}属性:

SolidColorBrush

除此之外,从颜色到画笔的转换看起来像这样:

<TextBlock ... >
    <TextBlock.Foreground>
        <SolidColorBrush Color="{Binding SetValueColor}" />
    </TextBlock.Foreground>
</TextBlock>