从SQL获取数据后如何在组合框中添加新项目?



我的代码中有组合框,我使用此代码将数据库与组合框链接 :

            cmb_username.ItemsSource = database.vw_userss.ToList();
        cmb_username.DisplayMemberPath = "FullName";
        cmb_username.SelectedValuePath = "UserID";

这是工作。 但我自己魔杖添加新的静态项目,我使用了这个:

cmb_username。Items.Add("Every body"(;

而且它不起作用。

编辑:

既然@Adam文森特正确地指出,我至少应该在提出一个糟糕的解决方法之前展示最好的答案,就在这里。

您的 userControl 应该有一个已定义的 DataContext(一个 ViewModel(,它实现了 INotifyPropertyChanged。

public class UserListViewModel : INotifyPropertyChanged

此视图模型应具有用户的可观察集合,如果需要更改单个项中的某些信息,则可能还有视图模型。

private ObservableCollection<UserViewModel> _users;
public ObservableCollection<UserViewModel> Users
{
    get => _users = _users ?? GetUsersFromDatabase(); // Gets users from the database if not already initialized
    set
    {
         _users = value;
         NotifyPropertyChanged();
    }
}

NotifyPropertyChanged(( 方法如下:

public void NotifyPropertyChanged([CallerMemberName] string propertyName = "") => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

cmb_username的 ItemsSource 属性应绑定到此集合,因此在 xaml 中你将拥有:

<ListBox x:Name="cmb_username" ItemsSource="{Binding Users}"/>

因此,当您加载新用户时,您应该执行以下操作:

private void AddUser(UserViewModel user)
{
    Users.Add(user);
    NotifyPropertyChanged(nameof(Users));
}

列表框将神奇地自行更新。


原文:

在理想的 MVVM 模式中,您将拥有一个 ViewModel,其中 ObservableCollection 绑定到 ComboBox 的 ItemsSource,并且您必须通过 INotifyPropertyChanged 的 PropertyChanged 事件通知更改。

在这种情况下,一个可怕的(但有效的(技巧可能是在从数据库中获取新项目后初始化新列表:

var list = database.vw_userss.ToList();
cmb_username.ItemsSource = list; 
cmb_username.DisplayMemberPath = "FullName";
cmb_username.SelectedValuePath = "UserID";
// ... //
var newUser = // ... get the new user from the database //;
list.Add(newUser);
cmd_username.ItemsSource = new List<User>(list);

不能修改组合框Items属性。请参阅此示例:

private List<User> GetUsers()
{
    return new List<User>
    {
        new User { UserId = 1, FullName = "Test1"},
        new User { UserId = 2, FullName = "Test2"},
        new User { UserId = 3, FullName = "Test3"},
    };
}
private void BindUsers()
{
    var users = GetUsers(); // Get users from database
    // add your new item
    users.Add(new User { UserId = 4, FullName = "Test4"});
    cmb_username.ItemsSource = users;
    cmb_username.DisplayMemberPath = "FullName";
    cmb_username.SelectedValuePath = "UserID";
}

您可以向从数据库加载的列表中添加新项,而不是添加到组合框项。

最新更新