2013-09-10 3 views
0

Я получил телефон приложение для Windows с ListPicker, связанным с ObservableCollection и выбранного элемента:Удаление выбранного элемента из ListPicker

<toolkit:ListPicker Header="Endgame condition" ItemsSource="{Binding Conditions}" 
        SelectedItem="{Binding SelectedCondition, Mode=TwoWay}" /> 

И в ViewModel:

public ObservableCollection<string> Conditions 
{ 
    get { return conditions; } 
} 

public string SelectedCondition 
{ 
    get { return selectedCondition; } 
    set 
    { 
     if (selectedCondition != value) 
     { 
      selectedCondition = value; 
      OnPropertyChanged("SelectedCondition"); 
     } 
    } 
} 

Когда Я пытаюсь удалить выбранный элемент из списка в обработчике кнопок, я получаю InvalidOperationException (SelectedItem всегда должен быть установлен в действительное значение):

public void ConfirmCondition() 
{ 
    var selected = selectedCondition; 
    SelectedCondition = null; 

    // throws an exception: SelectedItem must always be set to a valid value 
    conditions.Remove(selected); 
} 

Я надеялся, что установка SelectedCondition на null (которая на самом деле является первым элементом в списке), исправит его, но это не так. Похоже, что NotifyPropertyChanged в SelectedCondition (привязанный к элементу SelectedPicker ListItem с режимом привязки TwoWay) не обновляет SelectedItem до того, как Remove инициирует уведомление CollectionChanged для ItemsSource.

Любые идеи, как я могу удалить элемент, не получая исключения?

+0

Что это за «Исключение», о котором вы только что упоминаете в своем последнем предложении? – Sheridan

+0

@Sheridan: Я выяснил проблему. Это было InvalidOperationException (см. Комментарий в коде). –

ответ

1

Хотя я не могу быть на 100% уверенным в зависимости от кода, который вы указали, вероятно, потому, что элемент «selected» на самом деле не является членом коллекции «условия».

Поскольку вы используете отдельный объект для отслеживания выбранной коллекции, вам нужно будет найти эквивалентный элемент в коллекции и удалить его. (Вы не можете удалить элемент из коллекции, которая не входит в коллекцию в первую очередь. Даже если они представлены одинаково на экране.)

Попробуйте что-нибудь в этом роде.

foreach(var item in conditions) 
{ 
    if(item.Equals(selectedCondition)) 
    { 
     conditions.Remove(item); 
    } 
} 

(Убедитесь, что Equals подходяще способен правильно определить правильный экземпляр в коллекции.)

+0

, насколько я могу сказать из стека вызовов, проблема в том, что в момент, когда я удаляю элемент из коллекции, он все еще является SelectedItem в ListPicker, и после его удаления из коллекции вызывается SetTelecter ListPicker SelectItem (потому что базовая коллекция изменилась). Попытка отменить выбор сначала не показала никакого эффекта. –

+0

Проблема оказалась в том, что я имел «null» как элемент в списке и пытался установить это, поскольку выбранный элемент не работал. Я заменил его строкой-заполнителем «Пожалуйста, выберите ...», и она отлично работала. –

0
public ObservableCollection<string> Conditions 
{ 
    get { return conditions; } 
    set { return contitions; 
    OnPropertyChanged("SelectedCondition"); 
    } 
} 

public void ConfirmCondition() 
{ 
    if(SelectedCondition != null){ 
    conditions.Remove(SelectedCondition); 
    } 
} 

работа? @Matt Lacey Если вы добавляете элемент, как вы удаляете элемент, вам не нужно разбирать ObservableCollection.

Смежные вопросы