1

CodeProject の記事の簡単なアプリケーションを作成しました (完全な記事はこちら。この質問のソース コードは、ここから直接ダウンロードできます)。

これは、単純なオブジェクト (3 つのプロパティ: 2 つの文字列、1 つの int) を持つ ListBox を持つ非常に単純なウィンドウです。

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 行目になります)。

string選択した値を aから anに変更すると、例外が発生しintます。混乱を避けるために、どちらもstring表示するプロパティを表しています。

エラーを再現するには、79 行目をコメントアウトします。デモを実行します。

  • SelectedValuePath コンボボックス (2 つ目) の最初の 2 つの文字列プロパティのいずれかを選択します。
  • リストボックスの選択を変更します (SelectedValueそれに応じて変更が表示されます) 。
  • 2 番目のコンボボックスの選択を int プロパティ (実際には文字列表現) に変更します。「入力文字列が正しい形式ではありませんでした」というエラーとともに例外がスローされます。

奇妙なことに、手順を繰り返しても、最初に int プロパティを選択すると、正常に動作します。その場合、文字列に変更しても問題なく動作します。int に戻ると、例外がスローされます。

を設定するSelectedValuePath前に null に設定すると、問題が解決するようです。あなたの例外がスローされる理由と問題は何ですか?

編集:これは、より多くのプロパティタイプを備えた新しいデモです。また、どのエラーがスローされたかを示し、次を追跡しSelectedIndexます: Download new demo

4

1 に答える 1

0

78行目がコメントアウトされている場合、item_indexは未定義のようです。編集:おっと!79行目だったはず。

編集: OK、問題は、SelectedValuePath が単に文字列を文字列に変換することを期待していることです。しかし、「値」が整数であると想定されていることを伝えると、何らかの整数の文字列バージョンを渡すことが期待されます。次に、これを適切な整数値に変換できます。あなたはまだ名前を渡していますが、それを整数に変換することはできず、そう伝えます。コードをステップ実行して名前を「ShapeSides」ではなく「2」などに変更すると、正しく実行されます。選択した値のインデックスを確認し、型が文字列の場合は 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 に答える