如何在 WPF 中将接口类型作为 ConverterParameter 传递

Ste*_* CO 1 c# wpf xaml interface ivalueconverter

我希望能够将接口的 Type 对象作为 ConverterParameter 传递给我的类型转换器。我的想法是,我希望转换器根据源值是否实现特定接口返回一个值。

如果我将类型名称作为字符串传递,我有一个方法可以工作,但我宁愿让它成为一个强类型值,以避免潜在的维护问题,并进行编译时检查,而不是依赖运行时的故障。

这是我使用字符串的转换器:

class InterfaceToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value != null)
        {
            var type = value.GetType();
            if (type.GetInterface(parameter as string) != null)
            { return Visibility.Visible; }
        }
        return Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

除了上述潜在的维护问题之外,它的效果很好。

这是您在 xaml 中使用它的方式:

<TabItem Header="General" 
         Visibility="{Binding ConverterParameter=IMyType, Converter={StaticResource InterfaceToVisibilityConverter}}">
    <TextBlock Text="Whatever Content Goes here."/>
</TabItem>
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,它检查当前的 DataContext 以确定它是否支持接口 IMyType,如果支持,则选项卡将可见。如果没有,选项卡将折叠。对于创建对其数据源功能敏感的 UI 非常方便。

有什么办法可以完成我想做的事情吗?

Fed*_*gui 5

使用{x:Type}标记扩展

TabItem Header="General" 
        Visibility="{Binding ConverterParameter={x:Type my:IMyType}, 
                             Converter={StaticResource InterfaceToVisibilityConverter}}">
Run Code Online (Sandbox Code Playgroud)