7

我正在尝试创建 TypeConverter,如果我将它绑定到按钮命令,它将把我的自定义类型转换为 ICommand。

不幸的是,WPF 没有调用我的转换器。

转换器:

public class CustomConverter : TypeConverter
{
    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    {
        if (destinationType == typeof(ICommand))
        {
            return true;
        }

        return base.CanConvertTo(context, destinationType);
    }

    public override object ConvertTo(
        ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == typeof(ICommand))
        {
            return new DelegateCommand<object>(x => { });
        }

        return base.ConvertTo(context, culture, value, destinationType);
    }
}

xml:

<Button  Content="Execute" Command="{Binding CustomObject}"  />

如果我将绑定到以下内容,将调用转换器:

<Button  Content="{Binding CustomObject}"  />

有什么想法可以让 TypeConverter 工作吗?

4

1 回答 1

3

如果您创建一个ITypeConverter. 但是你必须明确地使用它,所以它是更多的 xaml 来编写。另一方面,有时明确是一件好事。如果您试图避免必须在 中声明转换器,则Resources可以从MarkupExtension. 所以你的转换器看起来像这样:

public class ToCommand : MarkupExtension, IValueConverter
{
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }

    public object Convert(object value, 
                          Type targetType, 
                          object parameter, 
                          CultureInfo culture)
    {
        if (targetType != tyepof(ICommand))
            return Binding.DoNothing;

        return new DelegateCommand<object>(x => { });
    }

    public object ConvertBack(object value, 
                              Type targetType, 
                              object parameter, 
                              CultureInfo culture)
    {
        return Binding.DoNothing;
    }
}

然后你会像这样使用它:

<Button Content="Execute" 
        Command="{Binding CustomObject, Converter={lcl:ToCommand}}" />
于 2013-08-19T19:41:59.860 回答