0

http://mobileworld.appamundi.com/blogs/andywigley/archive/2012/02/02/how-to-databind-selecteditems-of-the-listpicker-and-recurringdaypicker.aspxの指示に従って、複数選択で SelectedItems をバインドしましたリストピッカー。

ViewModel で作成されたオブジェクトの ObservableCollection に ItemsSource をバインドすると、ListPicker は問題なく動作します。ただし、ItemsSource を WCF サービスから取得した ObservableCollection にバインドすると、問題が発生します。ListPicker はすべての項目を適切に表示し、それらを選択してメイン画面で選択済みとして表示することもできます。しかし、ピッカーをクリックして再度選択すると、ListPicker はテンプレートで選択した項目を「チェック」できません。

サービスから取得したすべての要素のリストを書き直すことはできますが、その問題を解決するきちんとした方法があるかどうか疑問に思っていますか?

プロジェクト情報: WP 7.0、WCF サービス、EntityFramework、たくさんのコーヒー

エンティティ クラス:

DataContract(IsReference=true)]
public class TypeOfDish
{
    [DataMember]
    public int TypeOfDishID { get; set; }
    [DataMember]
    public string NameToDisplay { get; set; }
}

WCF サービス:

[ServiceContract]
public interface IMyService
{
    [OperationContract]
    [ApplyDataContractResolver]
    IEnumerable<TypeOfDish> GetDishTypes();
}

Xaml:

<StackPanel x:Name="DishTypeGroup" Orientation="Vertical" Width="400">
    <helpers:ListPickerExtended x:Name="TypeOfDishPicker" >
         ItemsSource="{Binding DishTypeList}" 
         SelectionMode="Multiple"
         SelectedItems="{Binding SelectedDishTypes, Mode=TwoWay}"
         Margin="8,0,0,0" HorizontalAlignment="Stretch" VerticalAlignment="Center">

        <toolkit:ListPicker.FullModeItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Path=NameToDisplay}" />
            </DataTemplate>
        </toolkit:ListPicker.FullModeItemTemplate>
    </helpers:ListPickerExtended>
</StackPanel>

ListPickerExtended.cs

public class ListPickerExtended : ListPicker
{
    public new IList SelectedItems
    {
        get
        {
            return (IList)GetValue(SelectedItemsProperty);
        }
        set
        {
            base.SetValue(SelectedItemsProperty, value);
        }
    }
}

ビューモデル

public ObservableCollection<TypeOfDish> DishTypeList
{
    get
    {
        //myModel.DichTypes is loaded with data from calling 
        //GetDishTypesAsync() on my service client
        return myModel.DishTypes;
    }
}

ObservableCollection<object> _selectedDishes = new ObservableCollection<object>();

public ObservableCollection<object> SelectedDishTypes
{
    get { return _selectedDishes; }
    set
    {
       if (_selectedDishes == value) { return; }
       _selectedDishes = value;
       RaisePropertyChanged("SelectedDishTypes");
    }
}
4

1 に答える 1

0

私はちょうど解決策を見つけました。

ページが読み込まれるたびに、サービスからデータを取得していました。ListPicker のフル モード テンプレートから戻ると、メイン ページがリロードされ、新しくフェッチされたデータを使用して DishTypesList プロパティがリセットされました。ListPicker.SelectedItems はまだ設定されていましたが、新しいオブジェクトはそれらのオブジェクトと一致しませんでした。

読み込みデータを View Model コンストラクターに移動するだけで、ListPicker が正しく機能し始めました。

于 2012-02-18T12:09:44.157 に答える