2013-03-07 2 views
0

У меня есть два ViewModel, на первом ViewModel у меня есть ListBox:SelectedItem всегда должен быть установлен на действительное значение

<ListBox x:Name="MainMenu" toolkits:TiltEffect.IsTiltEnabled="True" 
SelectedItem="{Binding SelectedItem, Mode=TwoWay}" 
ItemTemplate="{StaticResource MainMenu}" 
ItemsSource="{Binding Categories}" Margin="0,97,0,0" 
Tap="MainMenu_Tap"> 

На второй странице, у меня есть listpicker

<toolkit:ListPicker Margin="0,153,0,0" Background="{StaticResource PhoneAccentBrush}" VerticalAlignment="Top" 
ItemsSource="{Binding Categories}" 
SelectedItem="{Binding Item}" 
ItemTemplate="{StaticResource CategorySelector}" 
FullModeHeader="Category" 
FullModeItemTemplate="{StaticResource FullCategorySelector}" 
BorderBrush="{StaticResource PhoneAccentBrush}"/> 

Что я хочу, когда я перейду на вторую страницу, выбранный элемент на первой странице будет выбран на второй странице. Но я всегда получаю, чтобы выбранный элемент всегда устанавливался на допустимое значение, когда я перехожу на вторую страницу.

первого ViewModel

private CategoryModel _selectedItem = null; 
public CategoryModel SelectedItem 
{ 
    get { return _selectedItem; } 
    set 
    { 
     if (_selectedItem == value) 
     { 
      return; 
     } 

     var oldValue = _selectedItem; 
     _selectedItem = value; 

     RaisePropertyChanged("SelectedItem", oldValue, value, true); 
    } 
} 

второй ViewModel

private CategoryModel _item = null; 
public CategoryModel Item 
{ 
    get { return _item; } 
    set 
    { 
     if (_item == value) 
     { 
      return; 
     } 

     var oldValue = _item; 
     _item = value; 

     // Update bindings, no broadcast 
     RaisePropertyChanged("Item"); 
    } 
} 

enter image description here

РЕДАКТИРОВАТЬ

Когда я изменяю listpicker на второй странице в Listbox, он работает очень хорошо.

Так что это вопрос enter link description here. Как мне сделать, чтобы эта вещь работала с listpicker?

ответ

0

Я думаю, что вы вводите в заблуждение виды и модели.

Поскольку вы привязываете выбранный элемент в XAML, когда XAML анализируется и создается страница, он пытается связать элемент в коллекции, которая еще не создана. Вот почему комментарии к ошибке указывают на то, как работать с этим кодом в коде.

В обработчике Tap на первой странице я предполагаю, что вы передаете некоторые детали выбранного элемента на вторую страницу. Поэтому вы могли бы удалить привязку XAML для выбранного элемента, а в обработчике события OnNavigatedTo на второй странице установить привязку в коде, как только вы знаете, что элемент ItemsSource заселен.

В качестве альтернативы вы могли бы подумать о том, что две страницы имеют один и тот же экземпляр вида viewmodel.

0

ListPicker использует Items.IndexOf для получения индекса экземпляра элемента, который следует выбрать.

Если экземпляр не соответствует (это не экземпляр объекта из коллекции), IndexOf будет возвращать -1, а исключение InvalidOperationException будет выведено с сообщением: «SelectedItem всегда должен быть установлен на допустимое значение».

Переопределить метод Equals типа в коллекции, и он будет работать должным образом.

Пример:

public override bool Equals(object obj) 
{ 
     var target = obj as ThisTarget; 
     if (target == null) 
      return false; 

     if (this.ID == target.ID) 
      return true; 

     return false; 
} 

Надеется, что это помогает