在这段代码之后:
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 的 SelectedValue = null,即使在即时窗口中,我也看到:
App.roamingSettings.Values["FromDaySection1"].ToString()
"16"
comboBoxFromDay.Items.Count
31
单步执行,赋值语句在两种情况下都运行,只是由于某种原因,comboxFromDay.SelectedValue 为 null,即使在赋值之后也是如此。
那么,使用完全相同的代码会导致这些相反的反应有什么不同呢?
有问题的两个组合框的 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;
}
那么它是如何在一种情况下起作用而在另一种情况下不起作用的呢?
顺便说一句,在“属性”窗格中查看的两个组合框的属性也是相同的(当然,名称除外;还有 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”),但数据类型会发生变化。
这是有道理的,因为桶一次只有一个值。如果是“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”
有没有更优雅的方法来实现这一点(比我运行我上面显示的 slapworthy 方法)?