0

我按照http://mobileworld.appamundi.com/blogs/andywigley/archive/2012/02/02/how-to-databind-selecteditems-of-the-listpicker-and-recurringdayspicker.aspx的说明在多选中绑定 SelectedItems列表选择器。

当我将 ItemsSource 绑定到 ViewModel 中创建的对象的 ObservableCollection 时,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();
}

xml:

<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 回答