如何在WPF中有效地在Combobox中添加项目

时间:2012-10-29 08:24:58

标签: c# .net wpf mvvm combobox

我是C ++开发人员,最近开始学习WPF。我正在使用一个wpf应用程序,我正在使用MVVM。我有组合框,我需要在其中添加项目。虽然我通常使用ComboboxPropertyName.Add(“”)来添加项目,但我正在寻找一种有效的方法来添加没有太多代码长度的项目。这是代码:

XAML:

<ComboBox Height="23" ItemsSource="{Binding BoardBoxList}" SelectedItem="{Binding SelectedBoardBoxList, Mode=TwoWay}" SelectedIndex="0" Name="comboBox2" />

ViewModel类:

public ObservableCollection<string> BoardBoxList
    {
        get { return _BoardBoxList; }
        set
        {
            _BoardBoxList = value;
            OnPropertyChanged("BoardBoxList");
        }
    }

    /// <summary>
    /// _SelectedBoardBoxList
    /// </summary>
    private string _SelectedBoardBoxList;
    public string SelectedBoardBoxList
    {
        get { return _SelectedBoardBoxList; }
        set
        {
            _SelectedBoardBoxList = value;
            OnPropertyChanged("SelectedBoardBoxList");
        }
    }

以下是我在C ++中使用组合框添加项目的方法:

static const signed char boards[][9] = {
{},                                           // left blank to indicate no selection
{ 'S', '1', '0', '1', '0', '0', '1', '2', 0 },   // redhook
{ 'S', '1', '0', '1', '0', '0', '1', '8', 0 },   // bavaria
{ 'S', '1', '0', '1', '0', '0', '2', '0', 0 },   // flying dog
};

m_boardBox = new ComboBox(String::empty);
for(int i = 1; i < 4; i++)
    m_boardBox->addItem(String((char*)(boards[i])), i); 
m_boardBox->setSelectedId(2); // select Bavaria by default
addAndMakeVisible(m_boardBox);

如果您注意到上述情况,您会发现循环添加项目很容易。这就是我想在我的组合框中添加项目的方法。

如果我使用_BoardBoxList.Add("....");,我将不得不使用许多.Adds。它们是一种有效的方式,我可以将项目存储在列表/集合中,并以for loop的形式将它们添加到组合框中,就像上面一样吗?

请帮忙:)

4 个答案:

答案 0 :(得分:1)

您可以使用ObservableCollection的构造函数,它可以使用枚举作为起始集。

new ObservableCollection<string>(boards);

董事会必须是字符串的集合而不是字符。

编辑:

var boards = new[]{ "S1010012" ,   // redhook
                   "S1010018",   // bavaria
                   "S1010020"    // flying dog
                  } 

答案 1 :(得分:0)

在C#中使用相同的循环来向observable集合中添加项目应该没有什么能阻止你,ComboBox会自动更新。除非你对你的问题更具体,否则没有别的可说的。

ItemsSource属性的目标是,您不必通过循环强制将项添加到ComboBox本身,而只是指定一个集合,控件将处理其余的项目,如何处理项目如果您的公司进入该系列。

答案 2 :(得分:0)

如果我理解正确,您可以使用AddRange

List方法

你可以创建列表(添加使用AddRange - 用于添加,for循环等),然后根据该列表创建Observable Collection。

ObservableCollection<string> collection 
                 = new ObservableCollection<string>(myList);

并且你可以将observable绑定到ItemSource,如果你需要它(更新),否则你可以绑定列表。

答案 3 :(得分:0)

使用ComboBox的{​​{1}}媒体资源。如果您使用ItemsSource作为来源,则可以忘记手动更新项目,只需使用视图模型中的列表。