1

我的 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 时,我的发现在我的附加项目中以选定的索引方法。它将变为空白。我不知道为什么它的行为如此..

4

3 回答 3

0

我已经实现了你的整个代码(除了我用其他服务替换的谷歌服务),它运行良好,UI 更新正常。我没有在代码中看到任何问题。在这里检查我的代码

所以。我建议您交叉检查您的“countryIndex”。创建另一个普通文本块并将这个 countryIndex 分配给该文本块及其值。

还将我的代码与您的代码进行比较,以便您获得一些线索。

于 2012-07-12T11:20:27.033 回答
0

在我的全景应用程序中使用 ListPicker 时,我也遇到了类似的问题。

我有一个从 0 到 50 的项目列表。

<toolkit:ListPicker x:Name="MyListPicker"  ItemsSource="{Binding MyList}" Width="174" Margin="10, 10, 0, 0" ItemTemplate="{StaticResource MyTemplate}">
</toolkit:ListPicker>

<DataTemplate x:Name="MyTemplate">
        <TextBlock Text="{Binding}" FontFamily="Calibri" FontSize="50" />
    </DataTemplate>

而且我注意到对于大于 38 或 40 的索引(就像您所做的那样),选择列表项后 UI 不会更新。它只是显示一个空白的 UI。

我也知道他们建议不要将 ListPicker 用于大型列表,但我猜 51 项是可以的(或者可能不是?)

因此,我相信这可能是 ListPicker 本身内部的一个问题。

于 2012-07-19T20:00:13.957 回答
0

经过3天的努力,我已经解决了这个问题。早些时候我认为这是我的 UI 线程中的问题,它没有得到刷新。当我假设那是问题时,我专注于那部分。但是在第 3 天,我注意到这在列表选择器控件中可能是错误的。我研究的是codeplex。有些人也面临这个问题。但我如何纠正让我告诉你。我做了四个步骤

  1. 我从我的项目中删除了 silverlight 工具包的所有引用并清理了解决方案。

  2. 我从 pc 安装了 silverlight 工具包,然后安装了 2011 年 11 月的稳定版本并重新启动了 PC,并从这个新安装中引用了我的项目中的 dll。

  3. 我也用我的 listpicker 控件绑定了选定的索引。

                <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.Resources>
                        <Style TargetType="toolkit:ListPickerItem">
                            <Setter Property="Padding" Value="8 6"/>
                        </Style>
                    </toolkit:ListPicker.Resources>
                    <toolkit:ListPicker.Style>
                        <StaticResource ResourceKey="ListPickerStyle"/>
                    </toolkit:ListPicker.Style>
                    <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>
    
于 2012-07-20T06:25:16.220 回答