1

私は 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.

要件:

  • ここで、例外に直面することなくboardNameversionおよびコンボボックスにある値をどのように設定するのか混乱しています。serialNoコンボボックスに settext プロパティがあるとは思いません。これを達成するための他の代替ソリューションはありますか?

  • 0 から 499 までの値を入力しても、4 桁の値として表示されるはずです。つまり、77 を追加すると、0077 として表示されるはずです。上記のコードで述べたように。

助けてください :)

4

1 に答える 1

1

まず、文字列の境界から抜け出しているため、例外が発生します。

String version = daughterBoard.Substring(8, 4)

..あなたが求めているのは、8番目以降に利用できる12文字がありません. 2 番目のパラメーターは、先頭ではなく、最初のパラメーターから必要な長さです。

次に、文字列がリストにあるかどうかを確認します。

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

SelectedDaughterVersionBoxList を設定すると、コンボボックスに適用されます。

選択したアイテムで行ったように、双方向バインディングは、リストボックスの選択したアイテムを設定する最良の方法です。

表示したいテキストをフォーマットする方法はいくつかあります。xaml でStringFormat属性を使用できる場合があります。もう 1 つは、コンバーターを使用することです。

あなたの場合のショートカットは、リストにデータを入力するときに文字列をフォーマットすることです。

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

これにより、コンボボックスに常に 4 桁が表示されるようになります。詳細については、こちらをご覧ください。リスト項目を実際に数値として処理する必要がある場合は、前述のように ObservableCollection を ObservableCollection に変換し、コンバーターを使用することをお勧めします。

于 2012-10-31T06:15:44.057 に答える