2015-12-15 3 views
0

У меня есть ShellViewModel, содержащий три свойства типа ViewModel:Держите SelectedItem при переключении между экранами

  1. Один публичный CurrentScreen собственности;
  2. Два частных: FirstViewModel и SecondViewModel объектов недвижимости.

FirstViewModel имеет ObservableCollection<Foo> FooCollection и SelectedFoo свойство типа Foo. Это двухстороннее связан с DataGrid в View, который является DataTemplate:

<DataGrid x:Name="setupsSensoresDataGrid"   
    ItemsSource="{Binding Source={StaticResource FooCollectionViewSource}}" 
    SelectedItem="{Binding SelectedFoo, Mode=TwoWay}"> 
    .... 

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

Я хотел бы знать, как сохранить выбор (как визуально, так и логически) при переключении с одного экрана на другой.

Мне кажется, что привязка данных TwoWay отменяет выбор SelectedFoo при перемещении View (DataTemplate).

+0

Возможный дубликат (но с несколько неэлегантным решением IMO): http://stackoverflow.com/questions/8808076/how-to-preserve-the-full-state-of-the-view-when-navigating-between -views-in-an-m – heltonbiker

+1

Можете ли вы представить свой код модели просмотра? Возможно, вы создаете новую модель представления при каждом изменении шаблона данных, поэтому ** сбрасывает ** свойство 'SelectedFoo'? –

ответ

1

Вы хотите сказать, что ваш текущий выбор (SelectedFoo) теряется при изменении CurrentScreen? Если это так, обычно это результат СелекторSelectedItem свойство получает установленное значение null при изменении его свойства ItemsSource.

Способ, которым я обычно занимаюсь этим, заключается в том, чтобы сделать фоновое поле, используемое для удерживания выделения (т. Е. Поле поддержки для SelectedFoo в вашем случае) поле static: это должно сохранить выбор (при условии, что вы не воссоздавая ваши модели просмотра каждый раз).

Например:

public Foo SelectedFoo 
{ 
    get 
    { 
     return _selectedFoo; 
    } 
    set 
    { 
     if (_selectedFoo != value) 
     { 
      _selectedFoo = value; 
      // INotifyPropertyChanged event dispatch... 
     } 
    } 
} 
static Foo _selectedFoo; 

Обратите внимание, что только поле Подложка static, свойство не должно быть, хотя это не будет иметь никакого значения.

Очевидно, что это будет работать только в том случае, если вы используете единственный экземпляр модели представления (который содержит свойство) в любой момент времени. Например, если есть список из списка в списке, то этот метод не будет работать, поскольку все они будут использовать одно и то же поле поддержки.

Иногда вам также может потребоваться явно указать значение null в настройке свойств. Другими словами, измените строку:

if (_selectedFoo != value) 

к:

if (value != null && _selectedFoo != value) 

я использовал оба варианта этого метода в прошлом.

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