我有一个组合框绑定到对象的集合。这些对象具有属性布尔值IsSelected,该属性指定当前是否选择要在ComboBox文本区域中显示的对象。组合框,WPF非常新
为了使它使用IsSelected布尔属性来显示ComboBox中的默认项目,我添加了一个类似下面的ValueConverter类。
public class SelectedItemConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value != null && value is IEnumerable<Car>)
{
return ((IEnumerable<Car>)value).Where(n => n.IsSelected).FirstOrDefault();
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value != null && value is Car)
{
return value;
}
return null;
}
}
我ComboBox位于UserContrl及其XAML是:
<ComboBox ItemsSource="{Binding CarsList}"
SelectedItem="{Binding CarsList, Converter={StaticResource selectedItemConverter}}"
DisplayMemberPath="Name">
</ComboBox>
我使用的SelectedItem,因为我的车对象有IsSelected是布尔和它所代表的汽车是否在组合框的文本区域中可见, 。出于这个原因,我有上面的ValueConverter使用该布尔值来正确返回对象。
这很好,当ComboBox加载时,IsSelected = True的对象将显示在ComboBox文本区域中。但是,如果我展开下拉菜单并选择另一个对象,则该对象将显示,但ComboBox会获得一个红色边框,据我所知,这意味着存在一些验证问题。
我该如何解决这个问题?
我见过很多例子,但他们都没有解决布尔属性IsSelected用来确定在ComboBox中显示哪个对象的问题。
我该如何解决这个问题?
也许问题是'ConvertBack'功能,它应该返回'IEnumerable的 CarsList'。无论如何,我认为你应该用这种方式重新考虑对'SelectedItem'的绑定。 –
bars222
你是对的,ConvertBack正在返回Car实例而不是CarList实例。但问题是我没有CarList实例,因为它没有传递到ConvertBack。所以不知道如何让它返回。 – pixel
我认为@Bolu建议如何更改绑定的好方法。否则,您可以尝试将'CarList'作为'ConverterParameter'传递(如果'CarList'集合永远不会更改,您可以在xaml中像定义资源那样定义它),但这是奇怪复杂的方式。 – bars222