2014-02-12 2 views
1

Я пытаюсь отобразить ComboBox со списком пользователей по их именам.WPF ComboBox редактируемое полевое связывание

Скажите, что у меня есть объект «Человек», и он имеет свойства «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 для строки, которую я хотел. Однако, когда я выбираю значение, вместо отображения соответствующей строки он просто отображает «Лицо», что имеет смысл, поскольку это тот объект, который он содержит.

Вопрос: как правильно изменить отображаемый полевой дисплей, как и остальные выпадающие списки?

Я думал об использовании того же переплетения на ComboBox.SelectedItem или ComboBox.Text, но они, похоже, не работали.

РЕШЕНИЕ:

Так я узнал истинную причину, почему она не работала, что я установил IsEditable = ложь. После изменения этой функции все работает нормально.

ответ

0

Вы можете попробовать этот способ отображения ПолноеИмя на редактируемом поле со списком при выборе пункта:

в Person класс добавить только для чтения свойство возвращать полное имя:

...... 
public string FullName { get { return FirstName + " " + LastName; } } 
...... 

затем установите TextPath свойство ComboBox в FullName:

<ComboBox TextSearch.TextPath="FullName" 
    ...... 
    /> 
0

Прежде всего, я бы рекомендовал использовать подход MVVM (Model-View-ViewModel) - вместо использования обратного кода, который отлично работает с технологией привязки WPF. После этого общая стратегия состоит в том, чтобы создать коллекцию объектов и привязать коллекцию к combobox. Коллекция должна содержать свойства типа, к которым может привязываться шаблон 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> 
+0

Я согласен с использованием MVVM, но я добавляю поверх уже написанного кода. Поэтому я не хотел повторно использовать весь класс. – tigersuen

Смежные вопросы