转换器

时间:2017-11-20 18:20:28

标签: c# xaml uwp

我在Windows Universal Application中定义了一个自定义Color类。我想使用ViewModelViewModel.ModelColorValueConverter)中此类型的属性绑定到ColorPicker。不幸的是,它不起作用。这就是我所拥有的:

XAML

<ColorPicker Color="{Binding ModelColor, Converter={StaticResource ColorConverter}, Mode=TwoWay}" />

转换器

 public class ColorConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            if (value == null)
            {
                return default(Color);
            }

            var c = (Color) value;
            return  Windows.UI.Color.FromArgb(c.A, c.R, c.G, c.B);
        }

        public object ConvertBack(object value, Type targetType, object parameter, string language)
        {
            var c = (Windows.UI.Color) value;
            return new Color(c.A, c.R, c.G, c.B);
        }
    }

当我运行它时,它会抛出一行:

 var c = (Windows.UI.Color) value;

这是一个例外:

enter image description here

发生了什么?我应该在Windows.UI.Color中收到value

编辑:我已经检查了&#34; value.GetType()&#34;这就是我得到的。太奇怪了!

enter image description here

1 个答案:

答案 0 :(得分:0)

以下是我如何使用它:

public Color SelectedColor
{
    get { return ColorFromText(SelectedColorAsText); }
    set
    {
        String  newColorAsText;

        newColorAsText = TextFromColor(value);

        if (newColorAsText != SelectedColorAsText)
        {
            SelectedColorAsText = newColorAsText;
            OnPropertyChanged(nameof(SelectedColor));
        }
    }
}

public String SelectedColorAsText { get; set; }

private Color ColorFromText(String text)
{
    Byte    a, r, g, b;

    a = Byte.Parse(text.Substring(1, 2),    System.Globalization.NumberStyles.AllowHexSpecifier);
    r = Byte.Parse(text.Substring(3, 2),    System.Globalization.NumberStyles.AllowHexSpecifier);
    g = Byte.Parse(text.Substring(5, 2),    System.Globalization.NumberStyles.AllowHexSpecifier);
    b = Byte.Parse(text.Substring(7, 2),    System.Globalization.NumberStyles.AllowHexSpecifier);

    return Color.FromArgb(a, r, g, b);
}

private String TextFromColor(Color color)
{
    return color.ToString();
}

(我选择任意将我的内部表示设为"#AARRGGBB"。)

然后,在XAML中,使用ColorPicker绑定Color的{​​{1}}属性:

{x:Bind}

如果您使用Color="{x:Bind Path=SelectedColor, Mode=TwoWay}" ,您将收到关于{Binding}无法转换为Exception的精彩System.__ComObject