3

我正在使用 MVVM,以防万一。

我的MainWindowViewModel有两个 DependencyProperties,TheListTheSelectedItemTheListList<Type>TheSelectedItemType

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更改为string而不是Type时,它​​可以工作)。但我不知道我需要从哪里开始编码以将 ComboBox 中的(希望是唯一的)DisplayName 转换回 Type 对象。

提前感谢您的帮助。我对这个很困惑。

4

2 回答 2

9

如果我正确理解了您的问题,那么您将 ItemsSource 上的 Converter 用于 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;
    }
}
于 2010-11-13T16:49:04.170 回答
1

确保您已将IsSynchronizedWithCurrentItemComboBox. 看看这个...

于 2010-11-13T16:00:45.623 回答