WPF ComboBox可编辑字段绑定

时间:2014-02-12 02:23:11

标签: c# wpf xaml data-binding combobox

我正在尝试按名称显示一个ComboBox用户列表。

假设我有一个对象“Person”,它有“FirstName”和“LastName”属性。 我已成功使用DataBindingIValueConverter正确填充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.SelectedItemComboBox.Text上使用相同的绑定,但它们似乎不起作用。

解决方案:

所以我发现它不起作用的真正原因是我设置了IsEditable = false。改变后,一切正常。

2 个答案:

答案 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"
    ......
    />