2013-10-22 40 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