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

时间:2010-11-13 15:55:39

标签: wpf binding types ivalueconverter

我正在使用MVVM,以防它有所作为。

我的 MainWindowViewModel 有两个DependencyProperties, TheList TheSelectedItem 列表列表<类型> TheSelectedItem 类型

MainWindow有一个 ComboBox 。当 MainWindowViewModel 加载时,它会抓取程序集中实现 IMyInterface 的所有类的列表,并将 TheList 设置为此。

这些类中的每一个都有一个名为 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);
        }
    }

所以,我最后得到的是一个 ComboBox ,其中包含一个用户应该能够理解的名称列表。真棒!这正是我想要的!

下一步:我将 ComboBox 的SelectedItem属性绑定到我的ViewModel中的 TheSelectedItem 属性。

问题在于:当我进行选择时,我的ComboBox周围会出现一个小红框,我的ViewModel上的 TheSelectedItem 属性永远不会被设置。

我很确定这是因为类型不匹配(ComboBox中的项目现在看起来是字符串, TheSelectedItem 类型为 Type - 同样,当我将 TheSelectedItem 更改为字符串而不是 Type 时,它可以正常工作)。但我不知道在哪里开始编码需要将ComboBox中的(希望是唯一的)DisplayName转换回Type对象。

提前感谢您的帮助。我对这个很难过。

2 个答案:

答案 0 :(得分:9)

如果我正确理解了您的问题,那么您可以在ItemsSource上使用该转换器来使用ComboBox吗?在这种情况下,我认为你可以让ItemsSource像它一样,而只是转换每种类型时,像这样。

<ComboBox ...>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=typeName, Converter={StaticResource TypeToDisplayNameConverter}}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

然后只转换转换器中的每种类型。

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

答案 1 :(得分:1)

确保ComboBox上的IsSynchronizedWithCurrentItem设置为true。检查this ...