未能在WPF中使用字符串变量存储组合框项目

时间:2012-10-31 05:49:03

标签: c# .net wpf mvvm combobox

我是一名C ++开发人员,刚开始从事WPF工作。在MVVM之后,我正在开发组合框,我必须在其中添加项目。好吧添加项目似乎很容易,但我遇到一个简单的问题,我无法弄清楚该怎么做。这是代码:

XAML:

<ComboBox Grid.Row="0" ItemsSource="{Binding DaughterBoardBoxList}" SelectedItem="{Binding SelectedDaughterBoardBoxList, Mode=TwoWay}" SelectedIndex="0" />
<ComboBox Grid.Row="1" ItemsSource="{Binding DaughterVersionBoxList}" SelectedItem="{Binding SelectedDaughterVersionBoxList, Mode=TwoWay}" SelectedIndex="0" />
<ComboBox Grid.Row="2" ItemsSource="{Binding DaughterSerialBoxList}" SelectedItem="{Binding SelectedDaughterSerialBoxList, Mode=TwoWay}" SelectedIndex="0" />

ViewModel类:

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

    public string _SelectedDBoardBoxList;
    public string SelectedDaughterBoardBoxList
    {
        get { return _SelectedDBoardBoxList; }
        set
        {
            _SelectedDBoardBoxList = value;
            OnPropertyChanged("SelectedDaughterBoardBoxList");
        }
    }

// Similarly for other 2 comboboxes

我在每个组合框中添加了如下项目:

  • DaughterBoardBoxItems =“S1010013”,“S1010014”,“S1010015”等
  • DaughterVersionBoxItems =“001A”,“001B”,“001C”等
  • DaughterSerialBoxItems = 1到499

我已经从1 - 499添加如下:

for (int j = 1; j < 500; j++)
{
      _DSerialBoxList.Add(j.ToString());
} 

现在执行某些操作时,我需要执行以下几个语句:

String daughterBoard = "S1010015001A0477"; // Hardcoded value for check
String boardName = daughterBoard.Substring(0, 8);
DaughterBoardBoxList = boardName;

String version = daughterBoard.Substring(8, 12);
DaughterVersionBoxList = version;

int serialvalue = Convert.ToInt32(daughterBoard.Substring(12, 16));
String serialNo = Convert.ToString(serialvalue);
DaughterSerialBoxList = serialNo;

longlabel += daughterBoard;

当我执行上面的代码时,它会在String version = daughterBoard.Substring(8, 12);Argumentoutofrange. Index and length must refer to a location within the string.

作为异常

要求:

  • 现在我很困惑如何设置组合框中boardNameversionserialNo中的值,而不必面对任何异常。我认为combobox有settext属性。他们是另一种替代解决方案吗?

  • 即使我输入0到499之间的值,它也应该显示为4位数值,即如果添加了77,它应该显示为0077.正如我在上面的代码中提到的那样。

请帮助:)

1 个答案:

答案 0 :(得分:1)

首先,异常即将发生,因为你正走出字符串边界。

String version = daughterBoard.Substring(8, 4)

..就是你所追求的,8号之后没有12个字符。第二个参数是第一个参数所需的长度,而不是开始。

然后检查字符串是否在列表中。

if (DaughterVersionBoxList.Contains(version))
{
     SelectedDaughterVersionBoxList = version;
}

设置SelectedDaughterVersionBoxList会将其应用于组合框。

双向绑定,就像您对所选项目所做的那样,是设置列表框中所选项目的最佳方式。

有两种方法可以格式化您想要显示的文本。有时您可以在xaml中使用StringFormat属性。另一种是使用converter

您的案例中的快捷方式是在填充列表时格式化字符串。

for (int j = 1; j < 500; j++)
{
      _DSerialBoxList.Add(j.ToString("D4"));
} 

这将确保你的Combobox总能获得4位数字。查看here以获取更多信息。如果情况要求您实际处理列表项作为数值,那么最好将ObservableCollection转换为ObservableCollection并使用我之前提到的转换器。