2014-02-12 69 views
1

我試圖顯示一個ComboBox與他們的名字的用戶列表。WPF組合框可編輯字段綁定

說我有一個對象「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設置爲我想要的字符串。 但是,當我選擇一個值,而不是顯示適當的字符串,它只是顯示「人」,這是有道理的,因爲這是它包含的對象。

我的問題是如何讓可編輯字段像其他下拉菜單一樣正常顯示?

我想過在ComboBox.SelectedItemComboBox.Text上使用相同的綁定,但他們似乎沒有工作。

SOLUTION:

所以我發現真正的原因爲什麼它沒有工作了,我已經設置IsEditable =假。改變後,一切正常。

回答

0

當選擇了一個項目你可以試試這個辦法在編輯ComboBox顯示全稱:

Person類添加只讀屬性返回全名:

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

然後設置組合框的TextPath屬性FullName

<ComboBox TextSearch.TextPath="FullName" 
    ...... 
    /> 
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> 
+0

我同意使用MVVM,但是我在已經編寫的代碼之上添加。所以我不想讓整個班級重新受到影響。 – tigersuen