我有一个组合框
<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
来实现。但这不是我想要的。
答案 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>
之间设置绑定。这可能是不同日子的练习!