1

Windows Phone 7 に 2 つの Silverlight リストピッカー コントロールがあります。

これがそのための私の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>

現在のシナリオは、ユーザーが国名を選択すると、その国の国コードも自動的に設定され、その逆も同様です。

このために、両方のリストにリストピッカーの選択変更イベントを使用しています。

これが私の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;
}

それでも、私のコードはエラーなしで正常に動作します。今、私が立ち往生しているトリッキーで難しい部分が来ます. 1 つの 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

コード全体を実装しました(他のサービスに置き換えたgoogleサービスを除く)。これは完全に機能し、UIは正常に更新されています。コードに問題はありません。ここで私のコードを確認してください

それで。'countryIndex'をクロスチェックすることをお勧めします。別の通常のテキストブロックを作成し、このcountryIndexをそのテキストブロックとその値に割り当てます。

また、私のコードをあなたのコードと比較して、あなたがいくつかの手がかりを得ることができるようにしてください。

于 2012-07-12T11:20:27.033 に答える
0

3日間の闘争の後、その問題を修正しました。以前は、UI スレッドの問題であり、更新されていないと考えていました。そして、それが問題だと思っていたので、その部分に焦点を当てました。しかし、3 日目に、リストピッカー コントロールではこれが間違っている可能性があることに気付きました。そして、私はコードプレックスで勉強しました。この問題に直面している人もいます。しかし、私がどのように是正したかをお話ししましょう。4つのステップを実行しました

  1. プロジェクトから Silverlight ツールキットの参照をすべて削除し、ソリューションをクリーンアップしました。

  2. PC から Silverlight ツールキットをインストールし、2011 年 11 月の安定版をインストールして PC を再起動し、この新しいインストールからプロジェクトの dll を参照しました。

  3. 選択したインデックスもリストピッカー コントロールにバインドしました。

                <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 に答える
0

私も、パノラマ アプリケーションで ListPicker を使用しているときに、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 に答える