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的解决方案似乎对答案非常有效。虽然我不想放弃泛型,但我会暂时停止使用它们。我只是想知道为什么泛型在使用双值列表时没有问题。