如何让combobox创建一个新对象以响应用户的文本输入?

时间:2014-12-10 23:20:47

标签: wpf xaml

我将项目存储在组合框的ItemSource属性中,但是,当用户键入列表中不存在的名称时,我需要它来创建新对象并将其用作SelectedObject。我是WPF的新手,习惯了WindowsForms,所以我可能只是以完全错误的方式做这件事,感谢任何输入。

的Xaml:

<Window x:Class="ComboExample.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<StackPanel>
    <ComboBox x:Name="cboName"  IsEditable="True" SelectionChanged="ComboBox_SelectionChanged"></ComboBox>
    <DockPanel>
        <Label>Selected Value</Label>
        <TextBox Text="{Binding Name}"></TextBox>
    </DockPanel>
    <Button Click="Button_Click">Click Me</Button>
</StackPanel>

和后面的代码(显示&#34;值为空&#34;如果您在

中键入新值
    class SomeClass
{
    public SomeClass(string name) {this.Name = name;}

    public string Name { get; set; }
}

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        cboName.ItemsSource = new SomeClass[] { new SomeClass("A"), new SomeClass("B") };
        cboName.DisplayMemberPath = "Name";
        cboName.SelectedItem = cboName.ItemsSource.OfType<SomeClass>().FirstOrDefault();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        SomeClass value = cboName.SelectedValue as SomeClass;
        if (value == null)
            MessageBox.Show("No item is selected.");
        else
            MessageBox.Show("An item is selected.");
    }

    SomeClass empty = new SomeClass("");
    private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        DataContext = cboName.SelectedItem as SomeClass;
        if (DataContext == null)
            cboName.SelectedValue = DataContext = empty;
    }
}

1 个答案:

答案 0 :(得分:1)

这里有一种方法:

<StackPanel>
    <ComboBox x:Name="cboName" ItemsSource="{Binding ComboBoxItems}" DisplayMemberPath="Name" SelectedItem="{Binding ComboBoxItems[0],Mode=OneTime}"  IsEditable="True"/>
    <DockPanel>
        <Label>Selected Value</Label>
        <TextBox Text="{Binding SelectedItem.Name,ElementName=cboName}"></TextBox>
    </DockPanel>
    <Button Click="Button_Click">Click Me</Button>
</StackPanel>

和背后的代码:

public partial class MainWindow : Window
{

    private ObservableCollection<SomeClass> _comboBoxItems;
    public ObservableCollection<SomeClass> ComboBoxItems
    {
        get
        {
            return _comboBoxItems;
        }

        set
        {
            _comboBoxItems = value;
        }
    }
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
        ComboBoxItems = new ObservableCollection<SomeClass>()
        {
            new SomeClass("First Name"),
            new SomeClass("Second Name"),
            new SomeClass("Third Name")
        };

    }
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        if (!ComboBoxItems.Any(x => x.Name == cboName.Text))
        {
            ComboBoxItems.Add(new SomeClass(cboName.Text));
        }
    }
}
public class SomeClass
{
    public SomeClass(string name) { this.Name = name; }

    public string Name { get; set; }
}

为了更好地管理您可能需要考虑的对象

  • 为选定的ComboBox项目(类型为SomeClass)定义新属性,并将其绑定到ComboBox SelectedItem
  • 使用ObservableCollection而非仅列出并实施INotifyPropertyChanges Interface