首页 > 解决方案 > 如何使用 mvvm 从数据库中加载组合框下拉列表并在 wpf 中进行多项选择

问题描述

我正在尝试使用数据库中的数据填充组合框下拉列表。这应该在加载窗口时动态加载

查看模型

public class StdBasicVM
{
        private ObservableCollection<string> _sStreamCmb;
        public ObservableCollection<string> sStreamCmb
        {
            get { return _sStreamCmb; }
            set { if (_sStreamCmb != value) { _sStreamCmb = value; OnPropertyChanged("sStreamCmb"); } }
        }

        private void COMBOBOX()
        {
            var connectionString = ConfigurationManager.ConnectionStrings["connscmag"].ConnectionString;
            using (var conn = new MySqlConnection(connectionString))
            {
                conn.Open();

                var query = "Select distinct entry FROM gidentifiers WHERE IDENTIFIER = 'STREAM' AND entry <> 'NULL'  ";
                using (var comm = new MySqlCommand(query, conn))
                {
                    using (var reader = comm.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            if (reader.HasRows)
                            {
                              sStreamCmb.Add(reader.GetString("entry").ToString());
                            }

                        }
                    }
                }


            }

        }

        public StdBasicVM()
        {
            COMBOBOX();
        }
}

窗户

<ComboBox x:Name="txtStream" Grid.Row="9" Grid.Column="1" 
Text="{Binding sStream, Mode=TwoWay}" 
DisplayMemberPath="Name" 
ItemsSource="{Binding sStreamCmb}"/>

sStreamCmb.Add(reader.GetString("entry").ToString()) 它会在未设置为对象实例的行对象引用上生成错误 。

标签: c#mysqlwpfmvvmcombobox

解决方案


在您的代码中,您没有初始化组合框可观察集合。更改此行:

private ObservableCollection<string> _sStreamCmb;

对此:

private ObservableCollection<string> _sStreamCmb= new ObservableCollection<string>();

它应该解决这个问题。您可以通过在您的 csproj 文件中添加此行来突出显示何时发生这种情况:

    <WarningsAsErrors>CS0649</WarningsAsErrors>

这会将上述情况视为错误,从而使您不必在运行时查找。


推荐阅读