【发布时间】:2014-08-08 19:34:27
【问题描述】:
在 WPF ComboBox 中,如何在使用 DisplayMemberPath 时使 ItemsSource 中的空实例可选?
我正在绑定到一个对象集合,并向该集合添加了 null。我还将 SelectedItem 绑定到属性。选择非空值时,我的 SelectedItem 属性会正确更改。但是当我从下拉列表中选择空项目时,我的 SelectedItem 属性不会改变。
我已将其隔离为使用 DisplayMemberPath,即它不会发生在字符串集合中,因为您不会使用 DisplayMemberPath。
这对我来说很有意义,因为没有我的对象实例,其中 DisplayMemberPath 为空白或 null,列表中只有一个 null 项。但是,我正在尝试找到最好的方法来提供一种方法来清除 ComboBox。
我想我可以创建一个我的对象的实例,其中 DisplayMemberPath 属性的值是一个空白字符串,但这对我来说似乎有点 hacky。
有什么建议吗?
我的例子如下:
这是我在 ItemsSource 中填写的类:
public class Car
{
public string Make { get; set; }
public Car(string make)
{
Make = make;
}
}
这是我的 xaml:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<ComboBox SelectedItem="{Binding MyCar}" ItemsSource="{Binding MyCars}" DisplayMemberPath="Make" />
</Grid>
这是我的代码:
public partial class MainWindow : Window, INotifyPropertyChanged
{
private Car myCar = null;
public List<Car> MyCars { get; set; }
public Car MyCar
{
get { return myCar; }
set
{
if (myCar != value)
{
myCar = value;
OnPropertyChanged("MyCar");
}
}
}
public MainWindow()
{
MyCar = null;
MyCars = new List<Car>();
MyCars.Add(null);
MyCars.Add(new Car("Ford"));
MyCars.Add(new Car("Chevy"));
MyCars.Add(new Car("Toyota"));
InitializeComponent();
}
#region INotifyPropertyChanged
/// <summary>
/// Occurs when a property value changes.
/// </summary>
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
/// <summary>
/// This function is used to raise an PropertyChanged event.
/// </summary>
/// <param name="prop">The name of the property whose value changed.</param>
internal void OnPropertyChanged(string prop)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(prop));
}
}
#endregion
}
【问题讨论】:
-
MyCars.Add(new Car(""));是否符合您的要求,我猜您在尝试绑定到Make的Make属性时遇到了问题@ -
你认为输入一个 null 值不是 hacky 吗? Null 没有 Make 属性。
-
@KevinDiTraglia 这不是需求问题,我可以按照您的描述和需要调整我的逻辑,只是试图确定 WPF 是否支持我不知道的东西
-
使用my
Selectable<T>approach,你可以拥有一个没有汽车的Selectable<Car>实例。