2

文字列のリストを listpicker コントロールにバインドする必要があるプロジェクトがあります。バインディングが (Loaded または OnNavigatedTo イベントで) 完了すると、listpicker が開き、バインドされた項目が表示されますが、一部の項目がランダムに表示されません (フルスクリーン モード)。リストピッカーが閉じ始めると、不足しているアイテムが表示されるようです。なぜこれが起こっているのか分かりません - それはリストピッカーのバグですか、それとも私が間違ってバインドしていますか?. Silverlight ツールキットの 2011 年 11 月リリースを使用しています。

PS: 少数のアイテム (最大 10 など) を使用する場合、問題は発生しないようです。

以下のコードを使用して問題を再現してください

メイン ページ XAML

        <TextBlock Text="Time of Day" Grid.Row="0" Margin="12,0,0,0" Style="{StaticResource PhoneTextNormalStyle}" />
        <toolkit:ListPicker x:Name="TimesOfDayList" Grid.Row="1" SelectionMode="Multiple" FullModeHeader="Time of Day"
                                    ExpansionMode="FullScreenOnly" ItemsSource="{Binding TimesOfDay}" 
                                    Margin="12,0,12,12">
            <toolkit:ListPicker.FullModeItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding}" Margin="24,0,0,0" Style="{StaticResource PhoneTextLargeStyle}" />
                </DataTemplate>
            </toolkit:ListPicker.FullModeItemTemplate>
        </toolkit:ListPicker>
    </Grid>

メインページのコードビハインド

private MainPageViewModel _viewModel;

    public MainPage()
    {
        InitializeComponent();
        Loaded += MainPage_Loaded;
        TimesOfDayList.SummaryForSelectedItemsDelegate = TimesOfDaySummary;
    }

    void MainPage_Loaded(object sender, System.Windows.RoutedEventArgs e)
    {
        _viewModel = new MainPageViewModel();
        DataContext = _viewModel;
    }

    private string TimesOfDaySummary(IList items)
    {
        string itemNames = string.Empty;

        if (items != null && items.Count > 0)
        {
            var itemsList = items.Cast<string>().AsQueryable();
            foreach (var item in itemsList)
            {
                if (item != itemsList.Last())
                    itemNames += item + ", ";
                else
                    itemNames += item;
            }
        }

        return itemNames;
    }

ビューモデル クラス

public class MainPageViewModel : INotifyPropertyChanged
{
    public MainPageViewModel()
    {
        TimesOfDay = new List<string>
                          {
                              "12:00 AM",
                              "12:30 AM",
                              "01:00 AM",
                              "01:30 AM",
                              "02:00 AM",
                              "02:30 AM",
                              "03:00 AM",
                              "03:30 AM",
                              "04:00 AM",
                              "04:30 AM",
                              "05:00 AM",
                              "05:30 AM",
                              "06:00 AM",
                              "06:30 AM",
                              "07:00 AM",
                              "07:30 AM",
                              "08:00 AM",
                              "08:30 AM",
                              "09:00 AM",
                              "09:30 AM",
                              "10:00 AM",
                              "10:30 AM",
                              "11:00 AM",
                              "11:30 AM",
                              "12:00 PM",
                              "12:30 PM",
                              "01:00 PM",
                              "01:30 PM",
                              "02:00 PM",
                              "02:30 PM",
                              "03:00 PM",
                              "03:30 PM",
                              "04:00 PM",
                              "04:30 PM",
                              "05:00 PM",
                              "05:30 PM",
                              "06:00 PM",
                              "06:30 PM",
                              "07:00 PM",
                              "07:30 PM",
                              "08:00 PM",
                              "08:30 PM",
                              "09:00 PM",
                              "09:30 PM",
                              "10:00 PM",
                              "10:30 PM",
                              "11:00 PM",
                              "11:30 PM"
                          };
    }

    private List<string> _timesOfDay;
    public List<string> TimesOfDay
    {
        get { return _timesOfDay; }
        set
        {
            if(_timesOfDay != value)
            {
                _timesOfDay = value;
                OnPropertyChanged("TimesOfDay");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}
4

2 に答える 2

1

プロジェクトhttp://www.codeplex.com/Download?ProjectName=silverlight&DownloadId=375366 に次のように記述されたパッチを送信しました 。

フル ピッカー ページに移動すると、競合状態が発生します。このページでは、RotationX プロパティをアニメーション化して回転させたアイテムが、UpdateOutOfViewItems デリゲートが呼び出される前に画面から移動した可能性があります。

その結果、一部のアイテムは RotationX が -90 のままになることがあります。

私の解決策は、デリゲートが最終的に実行されたときに表示されていたアイテムを収集するのではなく、アニメーションが作成されたときに表示されていたアイテムのリストを UpdateOutOfView アイテムに渡すことです。

http://www.codeplex.com/Download?ProjectName=silverlight&DownloadId=375366は、バグを修正するために必要な更新された ListPickerPage.xaml.cs ファイルです。

于 2012-05-04T14:15:58.570 に答える
1

あなたのコードを再現しましたが、同じ問題が発生しました。Style="{StaticResource PhoneTextLargeStyle}"からドロップするだけで

<DataTemplate>
<TextBlock Text="{Binding}" Margin="24,0,0,0" />
</DataTemplate>

それは問題を解決するように見えます。ただし、そのソースが Style プロパティに由来する奇妙な動作です。

他の可能性を試してみますが、他の情報が見つかったらお知らせします。

よろしく、

于 2012-04-17T09:44:21.990 に答える