Wpf 在XAML中声明类型列表

Wpf 在XAML中声明类型列表,wpf,xaml,ivalueconverter,Wpf,Xaml,Ivalueconverter,我正在使用一个值转换器,它需要获取类型列表,这是转换器的一个属性。如果我使用双值列表,我可以使用以下语法(按预期工作): 代码 public class MyConverter : IValueConverter { public List<double> MyList { get; set; } // ... } public class MyConverter : IValueConverter { public List<Type> My

我正在使用一个值转换器,它需要获取类型列表,这是转换器的一个属性。如果我使用双值列表,我可以使用以下语法(按预期工作):

代码

public class MyConverter : IValueConverter
{
    public List<double> MyList { get; set; }

    // ...
}
public class MyConverter : IValueConverter
{
    public List<Type> MyList { get; set; }

    // ...
}
这是我的转换器及其用法:

代码

public class MyConverter : IValueConverter
{
    public List<double> MyList { get; set; }

    // ...
}
public class MyConverter : IValueConverter
{
    public List<Type> MyList { get; set; }

    // ...
}
公共类MyConverter:IValueConverter
{
公共列表MyList{get;set;}
// ...
}
XAML

<Converter:MyConverter x:Key="MyConverter">
    <Converter:MyConverter.MyList>
        <System.Double>1</System.Double>
        <System.Double>2</System.Double>
    </Converter:MyConverter.MyList>
</Converter:MyConverter>
<Converter:MyConverter x:Key="MyConverter">
    <Converter:MyConverter.MyList>
        <x:Type TypeName="MyType1" />
        <x:Type TypeName="MyType2" />
    </Converter:MyConverter.MyList>
</Converter:MyConverter>


我猜XAML语法是错误的,但我找不到正确的语法。

好的,下面的示例编译并运行了……我看到正在调用转换器,列表中填充了两个类型对象。也许有更好的办法


以下是我使用的完整代码:

namespace WpfApplication4
{
    public class MyConverter : IValueConverter
    {
        public IList<Type> MyList { get; set; }

        public MyConverter()
        {
            MyList = new List<Type>();
        }

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return null;
        }

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

    public class MyType
    {
        public string Name { get; set; }

        public MyType()
        {

        }
    }
}

<Window x:Class="WpfApplication4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication4"
        xmlns:runtime="clr-namespace:System.Runtime.InteropServices;assembly=mscorlib"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <sys:String x:Key="testdata">TestData</sys:String>
        <x:Array x:Key="listoftypes" Type="{x:Type sys:Type}">
            <x:Type Type="local:MyType"/>
            <x:Type Type="local:MyType"/>
        </x:Array>
        <local:MyConverter x:Key="myconv" MyList="{StaticResource listoftypes}"/>
    </Window.Resources>
    <Grid>
        <TextBlock Text="{Binding Source={StaticResource testdata}, Converter={StaticResource myconv}}"/> 
    </Grid>
</Window>
命名空间WpfApplication4
{
公共类MyConverter:IValueConverter
{
公共IList MyList{get;set;}
公共MyConverter()
{
MyList=新列表();
}
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
返回null;
}
公共对象转换回(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
抛出新的NotImplementedException();
}
}
公共类MyType
{
公共字符串名称{get;set;}
公共MyType()
{
}
}
}
测试数据

似乎是XAML设计器中的bug。下面给出的代码对我有用。我可以构建并运行应用程序。但是在designer R#hight中,用System:Type亮起两行,设计器崩溃,每行出现两个错误:

错误1类型“Type”不能用作对象元素,因为它是 非公共或未定义公共无参数构造函数或 类型转换器。
错误2类型“type”不支持直接 内容。 所以,当我以前尝试过这个解决方案时(在给出以前的解决方案之前),我认为我做错了。 但编译器仍然没有给出任何编译错误。不管怎么说,它看起来是这样的:


系统名称:Int32
系统:双
就你所见,区别在于声明。您必须使用System.Type而不是x:Type

并将代码作为示例

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Windows.Data;
using System.Linq;

namespace stackProjects
{
    public class Holder : IValueConverter
    {
        public List<Type> Types { get; set; }

        public Holder()
        {
            Types=new List<Type>();
        }

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return Types.Select(x => x.Name).ToList();
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}
使用系统;
使用System.Collections.Generic;
利用制度全球化;
使用System.Windows.Data;
使用System.Linq;
命名空间堆栈项目
{
公共类别持有人:IValueConverter
{
公共列表类型{get;set;}
公共持有人()
{
类型=新列表();
}
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
返回类型.Select(x=>x.Name).ToList();
}
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
抛出新的NotImplementedException();
}
}
}
正如我所说的,发生这种情况是因为类型类是抽象的。
希望有帮助

也许我应该澄清这个问题。双列表转换器正在工作,只是想显示它如何正确工作。它只是不适用于类型列表。任何答案对您有用吗?@Artiom您的答案非常有用,谢谢。无论如何,在我决定什么是令人满意的答案之前,我想了解更多关于这个问题的信息。你尝试过给出的解决方案吗?我已经更新了我的解决方案,colinsmith的解决方案似乎对答案非常有效。虽然我不想放弃泛型,但我会暂时停止使用它们。我只是想知道为什么泛型在使用双值列表时没有问题。