我正在尝试按名称显示一个ComboBox
用户列表。
假设我有一个对象“Person”,它有“FirstName”和“LastName”属性。
我已成功使用DataBinding
和IValueConverter
正确填充ComboBox
,但未在ComboBox
(名为cbPersons)的可编辑字段中正确显示。
在代码背后:
List<Person> persons = ... ; // Assume populated with data
cbPersons.ItemsSources = persons;
在XAML中:
<ComboBox.ItemTemplate>
<DataTemplate>
... // Code for Multibinding "FirstName" and "LastName" to TextBox
</DataTemplate>
</ComboBox.ItemTemplate>
当我启动窗口时,所有内容都会在ComboBox
下拉列表中正确显示。我将ComboBox.Text
设置为我想要的字符串。
但是,当我选择一个值时,它不会显示相应的字符串,而只显示“Person”,这是有道理的,因为它是它所包含的对象。
我的问题是如何使可编辑字段与其他下拉列表一样正确显示?
我考虑在ComboBox.SelectedItem
或ComboBox.Text
上使用相同的绑定,但它们似乎不起作用。
解决方案:
所以我发现它不起作用的真正原因是我设置了IsEditable = false。改变后,一切正常。
答案 0 :(得分:0)
首先,我建议使用MVVM(Model-View-ViewModel)方法 - 而不是使用后端代码 - 这对WPF绑定技术非常有效。之后,一般策略是创建对象集合并将集合绑定到组合框。该集合应包含ComboBoxItem模板可以绑定的属性类型。您的代码看起来像这样:
public class PersonViewModel : INotifyPropertyChanged
{
public string First { get; set; }
public string Last { get; set; }
// Implement INotifyPropertyChanged
}
public class MyComboSample : Window
{
public ObservableCollection<PersonViewModel> People {get; set;}
public MyComboSample()
{
People = new ObservableCollection<PersonViewModel>();
People.Add(new Person{First="Foo", Last="Bar"});
DataContext = this;
InitializeComponents();
}
}
<!-- XAML Window -->
<ComboBox ItemsSource="{Binding People}">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding First}"/>
<TextBlock Text="{Binding Last}"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
答案 1 :(得分:0)
您可以尝试这种方式在选择项目时在可编辑的组合框上显示全名:
在Person
类中添加只读属性以返回全名:
......
public string FullName { get { return FirstName + " " + LastName; } }
......
然后将ComboBox的TextPath
属性设置为FullName
:
<ComboBox TextSearch.TextPath="FullName"
......
/>