4

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

代码

public class MyConverter : IValueConverter
{
    public List<double> 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>

但是,如果我尝试将此方法与类型列表一起使用,则会引发异常:

Object of type 'System.RuntimeType' cannot be converted to type 'System.Collections.Generic.List`1[System.Type]'

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

代码

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

    // ...
}

XAML

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

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

4

2 回答 2

2

似乎是 XAML 设计器中的错误。给定的波纹管代码对我有用。我可以构建和运行应用程序。但在设计器中,R# 用System:Type突出显示两行,设计器崩溃,每行出现以下两个错误:

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

<Window.Resources>
    <local:Holder x:Key="one">
        <local:Holder.Types>
            <System:Type>System:Int32</System:Type>
            <System:Type>System:Double</System:Type>
        </local:Holder.Types>
    </local:Holder>
</Window.Resources>
<Grid >
    <ListBox DataContext="{StaticResource one}" ItemsSource="{Binding Path=Types, Converter={StaticResource one}}" />
</Grid>

如您所见,区别在于声明。您必须使用 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();
        }
    }
}

正如我所说,发生这种情况是因为Type类是abstract。希望能帮助到你

于 2012-08-16T10:05:59.270 回答
1

好的,下面的示例编译并运行....我看到转换器被调用并且列表中填充了 2 个 Type 对象。可能有更好的方法来做到这一点。


这是我使用的完整代码:

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>
于 2012-08-16T09:30:08.050 回答