【问题标题】:Add combobox text to its Itemssource将组合框文本添加到其 Itemssource
【发布时间】:2024-04-12 04:50:02
【问题描述】:

我有一个组合框通过 MVVM 绑定到一个名为 Tenderness 的表。我正在使用实体框架。它可以正确显示所有记录,但我需要向它添加另一个功能。假设用户键入的文本不包含在组合框的 Itemssource 中,我希望能够直接将其添加到表中,然后也更新 Itemssource。现在我已经能够在没有 MVVM 的情况下做到这一点,我想知道如何使用 MVVM 来实现它。

【问题讨论】:

  • 您能否展示一下您是如何“在没有 MVVM 的情况下做到这一点的”?
  • 在组合框的文本框部分添加一个委托Lost Focus事件处理程序,检查当前文本,如果它包含在组合框项目中,则跳过,否则将其添加到数据库中,并刷新组合框的项目。

标签: c# wpf entity-framework mvvm combobox


【解决方案1】:

只需在绑定到ComboBoxText 属性的源属性的设置器中的LostFocus 事件处理程序中执行您之前所做的操作。

查看模型:

public ObservableCollection<string> Items { get; } = new ObservableCollection<string>() { "a", "b", "c" };

private string _text;
public string Text
{
    get { return _text; }
    set
    {
        _text = value;
        OnPropertyChanged(nameof(Text));

        //add the missing value...
        if (!Items.Contains(_text))
            Items.Add(_text);
    }
}

private string _selectedItem;
public string SelectedItem
{
    get { return _selectedItem; }
    set
    {
        _selectedItem = value;
        OnPropertyChanged(nameof(SelectedItem));
    }
}

查看:

<ComboBox IsEditable="True" Text="{Binding Text, UpdateSourceTrigger=LostFocus}" ItemsSource="{Binding Items}"
                  SelectedItem="{Binding SelectedItem}" />

【讨论】:

  • 是的,这会将新添加的文本添加到 ObservableCollection,现在如何将其添加到数据库中?
  • 这是一个完全不同的问题。但是您可以像以前在 LostFocus 事件处理程序中那样执行此操作。您询问了如何“如何使用 MVVM 实现这一目标”,这个问题已经得到解答。
  • 谢谢!但是我可以在 ObservableCollection 更改时引发事件并将新项目添加到实体吗?
  • ObservableCollection 类已经引发了 CollectionChanged 事件。所以你可以处理这个。
  • 最后一个问题,我如何告诉 Observable Collection 哪个是已添加的新项目,以便将其添加到数据库中?