このコードの後:
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になります。
これを達成するためのよりエレガントな方法はありますか(上記の私のスラップワースな方法を機能させるよりも)?