1

このコードの後:

    if ((App.roamingSettings.Values.ContainsKey("FromMonthSection1")) &&
        (!string.IsNullOrWhiteSpace(App.roamingSettings.Values["FromMonthSection1"].ToString())))
    {
        comboBoxFromMonth.SelectedValue = App.roamingSettings.Values["FromMonthSection1"].ToString();
    }
    if ((App.roamingSettings.Values.ContainsKey("FromDaySection1")) &&
        (!string.IsNullOrWhiteSpace(App.roamingSettings.Values["FromDaySection1"].ToString())))
    {
        comboBoxFromDay.SelectedValue = App.roamingSettings.Values["FromDaySection1"].ToString();
    }

...実行、comboBoxFromMonthのSelectedValue = "August"、期待どおり。ただし、comboBoxFromDay = nullのSelectedValueは、イミディエイトウィンドウに表示されていても、次のように表示されます。

App.roamingSettings.Values["FromDaySection1"].ToString()
"16"
comboBoxFromDay.Items.Count
31

それをステップスルーすると、どちらの場合も代入ステートメントが実行されます。何らかの理由で代入した後でも、comboxFromDay.SelectedValueがnullであるだけです。

では、まったく同じコードでこれらの反対の反応を引き起こしているのは何が違うのでしょうか?

問題の2つのコンボボックスのxamlは次のとおりです。

<ComboBox x:Name="comboBoxFromMonth" Height="24" Width="100" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="4" LostFocus="ComboBox_OnLostFocus" ></ComboBox>

<ComboBox x:Name="comboBoxFromDay" Grid.Row="1" Grid.Column="1" Height="24" Width="80" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="2" LostFocus="ComboBox_OnLostFocus"/>

XAMLは、comboBoxFromMonthに明示的なGrid.RowまたはGrid.Columnの割り当てがないことを除いて、すべての実用的な目的でまったく同じです。

また、ローミング値の設定はまったく同じです。

if (cmbxName == "comboBoxFromMonth")
{
    App.roamingSettings.Values["FromMonthSection1"] =
        comboBoxFromMonth.SelectedValue;
}
else if (cmbxName == "comboBoxFromDay")
{
    App.roamingSettings.Values["FromDaySection1"] =
        comboBoxFromDay.SelectedValue;
}

では、ある場合には機能し、他の場合には機能しないのはどうしてですか?

ところで、2つのコンボボックスの[プロパティ]ペインに表示されるプロパティも同じです(もちろん、[名前]とMaxDropDownHeight-520対Infinityを除きますが、それは無関係だと確信しています)。

解決済み(またはそう私は考えた)

ブランドンは頭に釘を打ちました:「。ToString()」を削除します:

if ((App.roamingSettings.Values.ContainsKey("FromDaySection1")) &&
    (!string.IsNullOrWhiteSpace(App.roamingSettings.Values["FromDaySection1"].ToString())))
{
    comboBoxFromDay.SelectedValue = App.roamingSettings.Values["FromDaySection1"];
}

...動作します。

アップデート

さて、それは結局まだ完全には解決されていませんでした。これについて私が気付いた奇妙なことがあります:

ローミング設定エンジンは、保存している値のデータ型を明らかに決定します。

「January」などの値を保存すると、それが文字列として保存されます。「1」から「12」などの値を保存すると、それがintとして保存されます。

ただし、「00」(適切に文字列として表示される)などの値と「10」から「59」などの値がある場合はどうなりますか?同じバケット(「ToMinuteSection1」など)に格納されますが、データ型はモーフィングされます。

バケットには一度に1つの値しかないため、これは理にかなっています。「00」の場合、文字列として表示されます。「10」の場合、intと見なされます。

ただし、これは、「ToMinuteSection1」に含まれる値が文字列(「00」など)の場合に機能するため、これらの値の取得に関しては少し扱いに​​くいものになります。

comboBoxToMinute.SelectedValue = App.roamingSettings.Values["ToMinuteSection1"].ToString();

...ただし、値がint( "59"など)と見なされる場合は除きます。次に、次のようにする必要があります。

comboBoxToMinute.SelectedValue = App.roamingSettings.Values["ToMinuteSection1"];

だから...ユーザーが何を選択しようとしているのかわからないので、私はこれを行うことができますが、それは私が叩かれるべきもののようです:

int toMinute;
string toMinuteStr = App.roamingSettings.Values["ToMinuteSection1"].ToString();
bool isInt = int.TryParse(toMinuteStr, out toMinute);
if (isInt) // it should alway be an int now
{
    if (toMinute < 10)
    {
        comboBoxToMinute.SelectedValue = toMinuteStr;
    }
    else
    {
        comboBoxToMinute.SelectedValue = toMinute;
    }
}

...そして実際、私は最初にこの方法でそれをやろうとしました:

int toMinute;
string toMinuteStr = App.roamingSettings.Values["ToMinuteSection1"].ToString();
bool isInt = int.TryParse(toMinuteStr, out toMinute);
if (isInt)
{
    comboBoxToMinute.SelectedValue = toMinute;
}
else
{
    comboBoxToMinute.SelectedValue = toMinuteStr;
}

...しかし、「09」は9に解析されるため、このトリックは機能しませんが、コンボボックスに「9」がなく、「09」だけであるため、割り当てはnullになります。

これを達成するためのよりエレガントな方法はありますか(上記の私のスラップワースな方法を機能させるよりも)?

4

2 に答える 2

2

コンボボックスの値は整数ですか、それとも文字列ですか? MSDN ドキュメントの備考によると、SelectedValue に設定した値がコンボボックスにない場合、選択がクリアされます (つまり、null に設定されます)。それらが整数の場合、ToString() が一致するアイテムを見つけられない可能性があります。

于 2012-12-25T17:16:38.607 に答える
1

別の問題を抱えているため、新しい回答を追加するのが最善なのか、以前の回答を編集するのが最善なのかわかりません。別の質問をしているので、新しい回答を追加する方が理にかなっていると思いましたが、モッズに整理させます.

あなたが説明したことから、comboBox には実際には 0 ~ 59 の整数だけを含めることができるように思えますが、それらをすべて 2 桁として表示する必要があります (10 未満の場合は先頭にゼロを付ける必要があります)。

この場合は、ComboBox のItemStringFormatプロパティを見てください。当たり前のことを言って申し訳ありませんが、これにより、comboBox に項目を表示するためのフォーマット文字列を指定できます。標準の .NET 形式の文字列を使用して先頭のゼロを指定し、整数を使用してコンボ ボックスに入力することができます。これで「型モーフィング」の問題が解決されることを願っています。

于 2012-12-26T01:15:25.740 に答える