2013-10-22 35 views
1

我为CodeProject上的文章写了一个快速应用程序(完整文章here。您可以直接从here下载此问题的源代码)。更改列表框SelectedValuePath引发异常

这是一个非常简单的窗口,它具有带简单对象的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的标签。

组合框被设置为类型的对象:

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)。

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

重现错误,注释掉行79运行演示:

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

奇怪的是:如果你重复这些步骤,但首先选择整型属性,它工作正常。改为一个字符串,然后,仍然正常工作。回到int,引发异常。

在设置之前将SelectedValuePath设置为null似乎可以解决问题。任何建议为什么你的例外被抛出,这有什么问题?

编辑: 下面是一个新的演示,其中包含更多属性类型。它还将显示抛出什么错误,并跟踪SelectedIndexDownload new demo

+0

如果我注释掉第78行,'item_index'不再被定义。我是否应该评论第81行?啊,我明白了。你的意思是第79行。再试一次.... – ouflak

+0

Argh,我的代码似乎不同步。好吧,第79行。这是我在上面的课程中注释掉的那个(它没有在演示中注释掉,因为它会崩溃)。我也会更新这个问题。 – Noctis

+0

当你把所有的事情都包下来的时候,看到你最后的项目会很有趣! – ouflak

回答

0

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

编辑:好的,问题是SelectedValuePath是简单地期望将字符串转换为字符串,当你告诉它期望一个字符串。但是当你告诉它它'value'应该是一个整数时,它期望你传入某种整数的字符串版本。它然后可以将其转换为相应的整数值。你仍然传递一个名字,它不能将它转换为一个整数,并告诉你。如果您逐步完成代码并将名称更改为“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; 
    } 
+0

是的,应该是79,我已经更新了。 (必须在提交后在我的代码中添加一行) – Noctis

+0

希望这有些用处。 – ouflak

+0

嘿,是和不是。我将演示扩展到其他属性类型,并收到不同的结果。我已经打开了另一个问题,以免搞砸这个问题。我将清理代码并在这里发布更新的演示。这个解决方案的问题在于它取决于开关和项目,因此不适用于您没有编写的类,或者不知道它包含什么。 – Noctis