我的 windows phone 7 中有两个 silverlight listpicker 控件。
这是我的 XAML。
// 国家名称的第一个列表选择器
<toolkit:ListPicker x:Name="listPickerCountryLogin" SelectionChanged="listPickerCountryLogin_SelectionChanged" Height="72" HorizontalAlignment="Left" Margin="14,43,0,0" VerticalAlignment="Top" Width="436" FullModeHeader="Select Country" Background="White" BorderBrush="White" Foreground="{StaticResource listPickerBrush}">
<toolkit:ListPicker.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Country}" Width="250" />
</StackPanel>
</DataTemplate>
</toolkit:ListPicker.ItemTemplate>
<toolkit:ListPicker.FullModeItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Country}" Width="300" Margin="0,0,0,20" FontSize="24"/>
</StackPanel>
</DataTemplate>
</toolkit:ListPicker.FullModeItemTemplate>
</toolkit:ListPicker>
// and here is my second listpciker for country codes
<toolkit:ListPicker x:Name="listPickerCCLogin" SelectionChanged="listPickerCCLogin_SelectionChanged" Height="56.3" Width="80" HorizontalAlignment="Left" Margin="14,100,0,0" VerticalAlignment="Top" FullModeHeader="Select Country" Background="White" BorderBrush="White" Foreground="{StaticResource listPickerBrush}">
<toolkit:ListPicker.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Name="lblCC" Text="{Binding CC}" Width="235" />
</StackPanel>
</DataTemplate>
</toolkit:ListPicker.ItemTemplate>
<toolkit:ListPicker.FullModeItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Country}" Width="300" Margin="0,0,0,20" FontSize="24"/>
</StackPanel>
</DataTemplate>
</toolkit:ListPicker.FullModeItemTemplate>
</toolkit:ListPicker>
现在的场景是如果用户选择国家名称,那么它将自动设置该国家的国家代码,反之亦然。
对于这件事,我对两个列表都使用了 listpicker 选择更改事件。
这是我的 C# 代码。
首先,我用这种方法将我的列表选择器与国家集合绑定。
/// <summary>
/// Binding All Listpickers With Data
/// </summary>
protected void BindListPickers()
{
CountryListParser oCountryList = new CountryListParser();
this.listPickerCountryLogin.ItemsSource = oCountryList.GetAllCountries();
this.listPickerCCLogin.ItemsSource = oCountryList.GetAllCountries();
}
这是列表选择器选择更改事件。
/// <summary>
/// Country List Picker Of Login Selection Change Event
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void listPickerCountryLogin_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (listPickerCountryLogin.SelectedIndex >= 0 && listPickerCountryLogin.SelectedIndex < listPickerCCLogin.Items.Count)
listPickerCCLogin.SelectedIndex = listPickerCountryLogin.SelectedIndex;
}
/// <summary>
/// Country Code List Picker Of Login Selection Change Event
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void listPickerCCLogin_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (listPickerCCLogin.SelectedIndex >= 0 && listPickerCCLogin.SelectedIndex < listPickerCountryLogin.Items.Count)
listPickerCountryLogin.SelectedIndex = listPickerCCLogin.SelectedIndex;
}
我的代码仍然可以正常工作,没有任何错误。现在到了我被卡住的棘手和困难的部分。我正在调用一项 Google 服务并传递用户的经纬度,它返回我的用户国家/地区,我想将该国家/地区设置为我的列表选择器。
这是我的代码
protected void OnLocationServiceResponseRecieved(string response)
{
JObject o = JObject.Parse(response);
string Country = (string)o["countryname"];
Dispatcher.BeginInvoke(new System.Action(delegate()
{
CountryListParser oCountryList = new CountryListParser();
int countrytIndex = oCountryList.CountryIndexByName(Country);
this.listPickerCountryLogin.SelectedIndex = countrytIndex;
this.listPickerCCLogin.SelectedIndex = countrytIndex;
}));
}
仍然没有例外,一切顺利,它根据我的国家/地区设置我的列表选择器选择的索引,但它不会更新我的列表选择器的 UI 并将它们设为空白,或者您可以说为空。但是当我在后端点击我的列表选择器时,我想要的国家已经设置好了。但未更新或卡在 UI 线程中。
So problem is UI is not updated properly
=== 更新 ===
当索引高于 38 时,我的发现在我的附加项目中以选定的索引方法。它将变为空白。我不知道为什么它的行为如此..