【问题标题】:How to Add Items in Combobox Efficiently in WPF如何在 WPF 中有效地在 Combobox 中添加项目
【发布时间】:2012-10-18 13:23:00
【问题描述】:

我是一名 C++ 开发人员,最近开始学习 WPF。我正在开发一个使用 MVVM 的 wpf 应用程序。我有组合框,我需要在其中添加项目。尽管我通常使用 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 的形式将它们添加到组合框中?

请帮忙:)

【问题讨论】:

    标签: c# .net wpf mvvm combobox


    【解决方案1】:

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

    new ObservableCollection<string>(boards);
    

    Boards 必须是字符串而不是字符的集合。

    编辑:

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

    【讨论】:

    • 好吧,使用 ObservableCollection 似乎是一个不错的方法,但您如何理想地在字符串集合中添加 board 项? :) 你能用代码详细说明吗 :)
    • @StonedJesus 我不太了解您的问题,但如果有帮助,请查看我的编辑。
    • 可以在构造函数之外创建var boards = new[] { };。我需要在我的方法中访问boards,并且由于它在构造函数中,它会引发一个错误,该错误在此上下文中不存在。
    • 您可以创建类字段并在其他方法中使用它。或带有 public static readolny 字段的静态类(因为这看起来像一个常量),您可以在整个程序中使用它。
    【解决方案2】:

    应该没有什么可以阻止您在 C# 中使用相同的循环将项目添加到可观察集合中,ComboBox 将自动更新。除非您对自己的问题更具体,否则无话可说。

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

    【讨论】:

      【解决方案3】:

      使用ComboBoxItemsSource 属性。如果您使用 ObservableCollection 作为源,您可以忘记手动更新项目,而只需使用视图模型中的列表。

      【讨论】:

      • 嗯,你是对的......使用 ObservableCollection 似乎是一个很好的方法,但你如何理想地在字符串集合中添加板项目? :) 你能用代码详细说明吗 :)
      【解决方案4】:

      如果我理解正确,您可以使用List 类的AddRange 方法

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

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

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

      【讨论】:

      • 直到现在我还没有使用 AddRange。看看我的 xaml 组合框绑定和我设置的属性。牢记这一点,添加board 中存在的项目的想法是什么?
      猜你喜欢
      • 2012-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      相关资源
      最近更新 更多