2015-05-01 10 views
3

Я создаю приложение на Android через Xamarin, используя MvvmCross.Mvvmcross ListView SelectedItem setter не достиг

Я некоторое время боролся с этой проблемой, и я нашел обход, но я уверен, что это неправильный способ сделать это.

Это касается выбранного элемента в MvxListView:

<Mvx.MvxListView 
 
    android:id="@+id/productSearchResultListView" 
 
    android:layout_width="fill_parent" 
 
    android:layout_height="fill_parent" 
 
    local:MvxBind="ItemsSource ProductSearchResultLst; SelectedItem SelectedProductSearchResult" 
 
    local:MvxItemTemplate="@layout/productsearchresult_row" />

При выборе пункта из этого списка, пользователь fowarded на страницу, где обрабатывается этот элемент. Как только это будет сделано, пользователь нажмет «подтвердить» и вернется в этот список. На этом этапе выделенный элемент подсвечивается (что мне нравится), но его нельзя снова щелкнуть. То есть, элемент не открывается, если вы нажмете на него снова. Я понимаю, почему. Нет выбранного изменения элемента. Тем не менее, я не могу отменить выбор выделенного элемента viewmodel SelectedProductSearchResult. Я поместил его в «null» на событие «OnRestart», исходящее из представления. Однако установщик выбранного элемента не будет достигнут при повторном выборе элемента .

Я также играл с ClearChoices и SetItemChecked на представлении непосредственно, но это не отмените выбранный элемент моей виртуальной машины, и поэтому мне не помогает.

Наконец, я понял, что выбранный элемент не изменяется (тот же объект), и поэтому сеттер не достигнут. Теперь я включил следующий фрагмент метода OnRestart в viewmodel, который обновляет список в том смысле, что все элементы являются новыми объектами:

var productLst = new List<WHM_PRODUCT>(); 
foreach (var item in ProductSearchResultLst) 
    productLst.Add (item.Clone()); 

ProductSearchResultLst = new ObservableCollection<WHM_PRODUCT> (productLst); 

Это работает, но я думаю, что это очень глупо, потому что это означает, что я должен делать это для каждого объекта отдельно.

Должен быть лучший способ сделать это.

Любая обратная связь очень ценится!

Stefaan

ответ

4

Вы не включили код вашего ViewModel, но я верю, вы исполняете навигационную логику в инкубаторе вашего SelectedProductSearchResult собственности. Это не стандартный подход, и вы должны использовать Команда.

Сначала реализовать Command свойство в вашем ViewModel:

public ICommand NavigateToDetailCommand 
     { 
      get 
      { 
       return new MvxCommand<WHM_PRODUCT>(item => 
       { 
        //Perform navigation logic here 
        ShowViewModel<DetailViewModel>(new { id = item.Id }); 
       }); 
      } 
     } 

Затем связать его ItemClick на вашем MvxListView:

local:MvxBind="ItemsSource ProductSearchResultLst; ItemClick NavigateToDetailCommand" 

Теперь whenewer пользователь нажимает на элемент списка, ваша команда выполняется и связанной с ними элемент передается как параметр.

+0

Endrus, большое спасибо. Хотя я был очарован элегантностью использования сеттера для целей навигации (ваше предположение о правильности моей реализации), ваше решение имеет больше смысла. Я реализовал его, и он работает красиво. Я все еще немного озадачен тем, почему сеттер не работает (т. Е. Второй раз), но это скорее теоретический вопрос, чем практический. Если кто-то должен знать ответ, мне интересно. Еще раз спасибо! –

+0

Добро пожаловать!:) О вашем решении - я думаю, что просто настройка SelectedProductSearchResult на null должна отменить выбор элемента списка. Вы уверены, что вызвали RaisePropertyChanged на SelectedProductSearchResult после того, как вы установили его значение в null? –

+0

Да, вызывается RaisePropertyChanged, так как это часть логики setter. –