Wpf 具有ValueConverter和自定义属性的类型组合框

Wpf 具有ValueConverter和自定义属性的类型组合框,wpf,binding,types,ivalueconverter,Wpf,Binding,Types,Ivalueconverter,我使用的是MVVM,以防它有所不同 我的主窗口视图模型有两个从属属性,列表和所选编辑项列表是一个列表,所选编辑项是一种类型 主窗口有一个组合框。当MainWindowViewModel加载时,它会获取程序集中实现IMI接口的所有类的列表,并将列表设置为该列表 每个类都有一个名为DisplayName的自定义属性,该属性有一个参数,用于显示类的用户友好名称,而不是应用程序知道的类名称 我还有一个ValueConverter,用于将这些类型转换为显示名称 public class TypeT

我使用的是MVVM,以防它有所不同

我的主窗口视图模型有两个从属属性,列表和所选编辑项列表是一个列表,所选编辑项是一种类型

主窗口有一个组合框。当MainWindowViewModel加载时,它会获取程序集中实现IMI接口的所有类的列表,并将列表设置为该列表

每个类都有一个名为DisplayName的自定义属性,该属性有一个参数,用于显示类的用户友好名称,而不是应用程序知道的类名称

我还有一个ValueConverter,用于将这些类型转换为显示名称

    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;
    }
}