从漫游设置加载选定的组合框项目

时间:2013-05-03 16:43:38

标签: c# xaml windows-8 microsoft-metro

我有一个组合框

<ComboBox x:Name="cityPicker">
    <ComboBoxItem IsSelected="True">
        <x:String>
            city1
        </x:String>
    </ComboBoxItem>
    <ComboBoxItem>
        <x:String>
            city2
        </x:String>
    </ComboBoxItem>

当用户选择“city2”时,我将其保存到selectedCity键中的漫游设置。

当用户在退出后以及从另一个页面返回此页面后启动应用程序时,我需要从漫游设置加载此值。

将此代码值保存到RoamingSetting,当我在更改城市后启动应用程序时,漫游设置具有其值。但是Combobox没有检索它。 Combobox选中的项目保持空白。

如何以编程方式更改组合框中的选定项目?

 protected override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
 {
     var roamingSettings = Windows.Storage.ApplicationData.Current.RoamingSettings;
     if (roamingSettings.Values.ContainsKey("selectedCity"))
     {
         cityPicker.SelectedValue = roamingSettings.Values["selectedCity"].ToString();
     }
 }

public StartPage()
        {
            InitializeComponent();

            cityPicker.SelectionChanged += cityPicker_SelectionChanged;
        }

        void cityPicker_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var roamingSettings =
               Windows.Storage.ApplicationData.Current.RoamingSettings;
            var cityPick = cityPicker.SelectedItem as ComboBoxItem;
            if (cityPick != null) roamingSettings.Values["selectedCity"] = cityPick.Content;
        }

我只能通过更改SelectedIndex来实现。但这不是我想要的。

1 个答案:

答案 0 :(得分:1)

所以,我想我知道这里发生了什么。您已使用ComboBox填充了ComboBoxItems,并且稍后尝试将其SelectedValue设置为string。执行此操作时,ComboBox会检查它是否包含该新值。它使用ComboBoxItem.Equals()执行此检查,检查引用相等性。显然,此检查将始终返回false,因为要比较的两个对象的类型不同,这就是ComboBox无法找到它并因此显示它的原因。这里要做的正确的事情是将ComboBox的{​​{1}}设置为强类型的字符串集合。如果这样做,ItemsSource将使用ComboBox进行相等性检查,该检查使用值类型相等语义执行相等。

假设您String.Equals()的{​​{1}}设置为“comboBox”。在您的代码隐藏事件处理程序处理程序中:

ComboBox

这是一个与您的代码直接相关的示例

XAML:

name

C#:

IEnumerable<string> foo = new[] { "A", "B", "C" };
comboBox.ItemsSource = foo;
comboBox.SelectedValue = "B"; // This should work

显然,执行此操作的“正确”方法是使用一个公开<ComboBox x:Name="cityPicker" /> 的视图模型。您可以将此视图模型设置为数据上下文,然后在public StartPage() { InitializeComponent(); cityPicker.ItemsSource = new[] { "city1", "city2" }; cityPicker.SelectionChanged += OnCityPickerSelectionChanged; } void OnCityPickerSelectionChanged(object sender, SelectionChangedEventArgs e) { // get your roaming settings var selectedItem = cityPicker.SelectedItem; roamingSettings.Values["SelectedCity"] = (string) selectedItem; } protected override void LoadState(...) { // get roaming settings, perform key check cityPicker.SelectedValue = (string) (roamingSettings.Values["SelectedCity"]); } 和视图模型ObservableCollection<string>之间设置绑定。这可能是不同日子的练习!