【问题标题】:WPF ComboBox editable field bindingWPF ComboBox 可编辑字段绑定
【发布时间】:2014-02-12 02:23:11
【问题描述】:

我正在尝试显示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。改回来后一切正常。

【问题讨论】:

    标签: c# wpf xaml data-binding combobox


    【解决方案1】:

    您可以尝试这种方式在选择项目时在可编辑组合框上显示全名:

    Person 类中添加只读属性以返回全名:

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

    然后将 ComboBox 的 TextPath 属性设置为 FullName

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

    【讨论】:

      【解决方案2】:

      首先,我建议使用 MVVM (Model-View-ViewModel) 方法 - 而不是使用后置代码 - 这与 WPFs 绑定技术非常有效。之后,一般的策略是创建对象集合并将集合绑定到组合框。该集合应包含 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>
      

      【讨论】:

      • 我同意使用 MVVM,但我在已经编写的代码之上添加。所以我不想重新改造整个班级。
      猜你喜欢
      • 2010-10-12
      • 2011-11-01
      • 2015-04-07
      • 1970-01-01
      • 1970-01-01
      • 2015-08-15
      • 1970-01-01
      • 2015-06-28
      • 2010-10-24
      相关资源
      最近更新 更多