1

我为 CodeProject 上的一篇文章写了一个快速应用程序(完整的文章在这里。你可以直接从这里下载这个问题的源代码)。

这是一个非常简单的窗口,它有一个带有简单对象的 ListBox(3 个属性:2 个字符串,1 个 int)。

public class MyShape
{
    public string ShapeType  { get; set; }
    public string ShapeColor { get; set; }
    public int    ShapeSides { get; set; }
}

我在SelectedValuePath后面的代码中设置,以便用户可以从组合框中选择一个属性,并SelectedValue在标签中查看当前。

ComboBox 设置为以下类型的对象:

public class PropertyObject
{
    public string PropertyName { get; set; }
    public string PropertyType { get; set; }
}

这两个属性都是字符串,因此,作为SelectedValuePath.

我正在设置这样的值:

private void ShapeClassPropertiesCmbx_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        ComboBox cmbx = (ComboBox)sender;
        PropertyObject prop_ob = ((PropertyObject)cmbx.SelectedItem);
        string name = prop_ob.PropertyName;
        var item_index = SourceListBox.SelectedIndex;
        //SourceListBox.SelectedValuePath = null;       // without this, we get a null exceptions when going from string to int properties for some reason.
        SourceListBox.SelectedValuePath = name;
        SourceListBox.SelectedIndex = item_index;
    }

(如果您下载代码,它是 MainWindow.xaml.cs 上的第 79 行)。

当我将所选值从 a 更改为 a 时,会发生string异常int。为避免混淆,两者都将string代表要显示的属性。

要重现错误,请注释掉第 79 行。运行演示:

  • 选择 SelectedValuePath 组合框(第二个)上前 2 个字符串属性中的任何一个。
  • 更改列表框上的选择(您应该会看到相应的SelectedValue更改)
  • 将第二个组合框中的选择更改为 int 属性(这实际上是一个字符串表示形式)。抛出异常并出现错误:“输入字符串的格式不正确”

奇怪的是:如果你重复这些步骤,但首先选择 int 属性,它工作正常。然后更改为字符串,仍然可以正常工作。回到int,抛出异常。

在设置之前将其设置SelectedValuePath为 null 似乎可以解决问题。有什么建议为什么会抛出异常以及问题是什么?

编辑:这是一个具有更多属性类型的新演示。它还将显示抛出的错误,并跟踪SelectedIndex下载新演示

4

1 回答 1

0

如果第 78 行被注释掉,看起来 item_index 是未定义的。编辑:哎呀!应该是第79行。

编辑:好的,问题是 SelectedValuePath 在您告诉它期望字符串时只是期望将字符串转换为字符串。但是当你告诉它它的“值”应该是一个整数时,它希望你传入某种整数的字符串版本。然后它可以将其转换为适当的数值。您仍然传入一个名称,它无法将其转换为整数并告诉您。如果您单步执行代码并将名称更改为“2”之类的名称,而不是“ShapeSides”,它将正确运行。我建议检查所选值的索引,如果类型应该是字符串,则设置 name = SelectedValue.ToString(),如果应该是整数,则设置 name = SelectedIndex.ToString()。

    switch (SourceListBox.SelectedIndex)
    {
        case 0:
        case 1:
            name = SourceListBox.SelectedValue.ToString();
            break;
        case 2:
            name = SourceListBox.SelectedIndex.ToString();
            break;
    }
于 2013-10-22T07:30:15.963 回答