ListPicker не «ставит галочку» на выбранные элементы, когда ItemsSource привязан к данным, полученным из сервиса - PullRequest
0 голосов
/ 18 февраля 2012

Я следовал инструкциям на http://mobileworld.appamundi.com/blogs/andywigley/archive/2012/02/02/how-to-databind-selecteditems-of-the-listpicker-and-recurringdayspicker.aspx, чтобы связать SelectedItems в множественном выборе ListPicker.

Когда я связываю ItemsSource с ObservableCollection объектов, созданных в ViewModel, ListPicker работает без проблем. Однако, когда я связываю ItemsSource с ObservableCollection, извлеченным из службы WCF, начинаются проблемы. 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);
        }
    }
}

ViewModel

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");
    }
}

1 Ответ

0 голосов
/ 18 февраля 2012

Я только что нашел решение.

Я загружал данные из сервиса каждый раз, когда страница загружалась.При возврате из шаблона полного режима в ListPicker, главная страница была перезагружена, сбросив свойство DishTypesList, используя вновь полученные данные.Хотя ListPicker.SelectedItems все еще был установлен, новый объект не соответствовал объектам в них.

Мне просто нужно было переместить загрузку данных в конструктор View Model, и ListPicker начал работать правильно.

...