我正在使用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对象。
提前感谢您的帮助。我对这个很难过。
答案 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 ...