绑定两个Combox

时间:2014-11-20 14:11:58

标签: c# sql-server wpf binding combobox

我的WPF应用程序中有两个组合框。

<ComboBox x:Name="itemsList" HorizontalAlignment="Left" Margin="10,90.767,0,0" VerticalAlignment="Top" Width="215" IsEditable="True" Height="23"/>


<ComboBox x:Name="pSize" HorizontalAlignment="Left" Margin="230,90.767,0,0" VerticalAlignment="Top" Width="109.538" Height="23" IsEditable="True" />

第一个组合框从数据库中获取具有此功能的项目,我在应用程序加载时初始化

  void getAllItems()
    {
        conn.Open();
        SqlCommand cmd = new SqlCommand("SELECT  DISTINCT item_name FROM items", conn);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        cmd.ExecuteNonQuery();
        SqlDataReader dr = cmd.ExecuteReader();

        while (dr.Read())
        {
            String items = dr.GetString(0);
            itemsList.Items.Add(items);
        }


        conn.Close();
    }

我想绑定我的第二个组合框&#34; pSize&#34;使用&#34; itemlist&#34;。我想从itemlist中获取值并传递给为&#34; pSize&#34;生成项目的方法。根据参数从数据库。我试图绑定它但不工作。

3 个答案:

答案 0 :(得分:1)

如果你想使用WPF,那么你应该正确使用它,而不像那样像你正在做的WinForms。在WPF中,我们不会以编程方式向UI控件添加项目。相反,我们将项添加到集合,然后将数据绑定到UI控件。通过这种方式,我们可以将相同的集合数据绑定到我们喜欢的尽可能多的UI控件。所以,尝试这样的事情:

private ObservableCollection<string> items = new ObservableCollection<string>();
public ObservableCollection<string> Items
{
    get { return items; }
    set { items = value; NotifyPropertyChanged("Items"); }
}

...

void getAllItems()
{
    conn.Open();
    SqlCommand cmd = new SqlCommand("SELECT  DISTINCT item_name FROM items", conn);
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    cmd.ExecuteNonQuery();
    SqlDataReader dr = cmd.ExecuteReader();

    while (dr.Read())
    {
        String items = dr.GetString(0);
        Items.Add(items);
    }
    conn.Close();
}

...

<ComboBox ItemsSource="{Binding Items}" />

不要忘记将DataContextUserControl的{​​{1}}设置为声明并填充Window属性的类的实例。您可能还会从阅读MSDN上的Data Binding Overview页面中受益。

答案 1 :(得分:0)

您最好创建一个模型,并将其应用于每个Combobox。现在,您可以使用数据库中的数据对业务逻辑进行编码,以在此模型中生成pSize项目。

您还可以使用LINQ将一些方法应用于每个List元素,并将结果(List)与pSize绑定。

List<T> newList = items.ForEach(item=> someMethod(item));

其中T是字符串,在你的情况下(如我所见)。

另请查看thisthis个帖子。

答案 2 :(得分:0)

最简单的方法,无需列出清单。我发现它是我的自我:

private void itemsList_DropDownClosed(object sender, EventArgs e)
{
   MessageBox.Show(itemsList.Text) 
}