Wpf 具有ValueConverter和自定义属性的类型组合框
我使用的是MVVM,以防它有所不同 我的主窗口视图模型有两个从属属性,列表和所选编辑项列表是一个列表,所选编辑项是一种类型 主窗口有一个组合框。当MainWindowViewModel加载时,它会获取程序集中实现IMI接口的所有类的列表,并将列表设置为该列表 每个类都有一个名为DisplayName的自定义属性,该属性有一个参数,用于显示类的用户友好名称,而不是应用程序知道的类名称 我还有一个ValueConverter,用于将这些类型转换为显示名称Wpf 具有ValueConverter和自定义属性的类型组合框,wpf,binding,types,ivalueconverter,Wpf,Binding,Types,Ivalueconverter,我使用的是MVVM,以防它有所不同 我的主窗口视图模型有两个从属属性,列表和所选编辑项列表是一个列表,所选编辑项是一种类型 主窗口有一个组合框。当MainWindowViewModel加载时,它会获取程序集中实现IMI接口的所有类的列表,并将列表设置为该列表 每个类都有一个名为DisplayName的自定义属性,该属性有一个参数,用于显示类的用户友好名称,而不是应用程序知道的类名称 我还有一个ValueConverter,用于将这些类型转换为显示名称 public class TypeT
public class TypeToDisplayName : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (targetType.Name == "IEnumerable")
{
List<string> returnList = new List<string>();
if (value is List<Type>)
{
foreach (Type t in value as List<Type>)
{
returnList.Add(ReflectionHelper.GetDisplayName(t));
}
}
return returnList;
}
else
{
throw new NotSupportedException();
}
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return typeof(BasicTemplate);
}
}
公共类TypeToDisplayName:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
if(targetType.Name==“IEnumerable”)
{
List returnList=新列表();
如果(值为列表)
{
foreach(在值中键入t作为列表)
{
Add(ReflectionHelper.GetDisplayName(t));
}
}
退货清单;
}
其他的
{
抛出新的NotSupportedException();
}
}
公共对象转换回(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
返回类型(基本模板);
}
}
因此,我最终得到的是一个组合框,其中包含用户应该能够理解的名称列表。令人惊叹的!这正是我想要的
下一步:将组合框的SelectedItem属性绑定到ViewModel中的SelectedItem属性
问题是:当我进行选择时,我的组合框周围会有一个小红色框,并且我的ViewModel上的TheSelectedItem属性从未设置
我很确定这是因为类型不匹配(组合框中的项目现在看起来是字符串,TheSelectedItem属于类型类型——而且,当我将TheSelectedItem更改为字符串而不是类型时,它会起作用)。但是我不知道从哪里开始编码,以便将组合框中的(希望是唯一的)显示名转换回类型对象
提前感谢您的帮助。在这个问题上我很困惑。请确保在
组合框中设置为true。检查…如果我正确理解了您的问题,那么您是否在组合框的ItemsSource上使用该转换器?在这种情况下,我认为您可以让ItemsSource保持原样,而只需在如下所示的情况下转换每种类型
<ComboBox ...>
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=typeName, Converter={StaticResource TypeToDisplayNameConverter}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
我只是试了一下。不幸的是,我没有得到任何帮助。不过,谢谢你的主意!你能编辑问题并发布你的绑定吗?你不需要像你想的那样通过转换器返回到类型…马上!当转换器一次性转换整个集合时,我应该知道我在做一些愚蠢的事情。谢谢@Anthony不需要使用转换器来显示字符串…将DisplayMemberPath设置为DisplayName并完成此操作。一起删除转换器。ComboBox的ItemsSource是一个类型列表。类型没有名为DisplayName的属性。
public class TypeToDisplayNameConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Type t = (Type)value;
return ReflectionHelper.GetDisplayName(t);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value;
}
}