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

时间:2012-10-24 12:16:52

标签: c# .net wpf mvvm combobox

我的wpf应用程序中有一个组合框,我需要在0到255之间添加256个项目。这看起来很简单,但我担心代码长度。

XAML:

<ComboBox ItemsSource="{Binding ChannelBitLengthList}" SelectedItem="{Binding SelectedChannelBitLengthList, Mode=TwoWay}" SelectedIndex="0" />

视图模型:

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

    private string _SelectedChannelBitLengthList;
    public string SelectedChannelBitLengthList
    {
        get { return _SelectedChannelBitLengthList; }
        set
        {
            _SelectedChannelBitLengthList = value;
            OnPropertyChanged("SelectedChannelBitLengthList");
        }
    }

Constructor:

//List of Channels
_ChannelBitLengthList.Add("0");
_ChannelBitLengthList.Add("1");
_ChannelBitLengthList.Add("2");
_ChannelBitLengthList.Add("3");
.......... till .Add("255");                    

我不想要这么多.Add()语句才能输入项目。是否有一种替代且更有效的方法,我可以在没有太多代码长度的情况下添加所有这255个项目?

5 个答案:

答案 0 :(得分:3)

由于您要插入最多255个项目(而不是254个),因此您可以使用:

for(int i=0;i<=255;i++)
{
  _ChannelBitLengthList.Add(i.ToString());
}

或者如果你想使用LINQ:

ChannelBitLengthList = new ObservableCollection<string>(Enumerable.Range(0, 256).Select(str=>str.ToString()));

答案 1 :(得分:1)

如果项目为1 ... 255

,您可以像这样写循环
for(int i=0;i<=255;i++)
  _ChannelBitLengthList.Add(i.ToString());

答案 2 :(得分:1)

这不起作用 -

for (int i =0 ;i <256;i++)
{
   _ChannelBitLengthList.Add(i.ToString());
}

这个怎么样 -

ObservableCollection<string> ChannelBitLengthList =
       new ObservableCollection<string>(Enumerable.Range(0, 256)
               .Select(t => t.ToString()));

答案 3 :(得分:1)

怎么样:

ChannelBitLengthList = new ObservableCollection<string>(Enumerable.Range(0, 256).Select(x=>x.ToString()));

答案 4 :(得分:0)

这种方法的一个问题是,每次更新时,可观察集合都会通知UI。因此每次都会不必要地重新渲染界面。如果你想阻止这种情况发生(类似于winforms中的旧Suspend&amp; ResumeLayout方法),你可以这样做:

using (Dispatcher.DisableProcessing())
{
  for(int i=0;i<=255;i++)
    _ChannelBitLengthList.Add(i.ToString());
}

禁用处理将停止UI更新。当DispatcherProcessingDisabled放置在Using范围的末尾时,它将再次重新启用UI布局处理。