2015-09-30 5 views
1

Как установить SelectedItem ListView в моем коде? Моя проблема заключается в том, что она не выделяется, когда я предварительно выбираю элемент в моем коде. ListView определен в файле xaml.Xamarin.Forms ListView set SelectedItem по коду

<ListView ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" /> 

Мои ViewModel

class MyViewModel 
{ 
    List<MyItem> Items {get; set;} 
    MyItem SelectedItem { get; set; } 

    public MyViewModel() 
    { 
     Items = new List<MyItem>{ ... }; 
     SelectedItem = Items.First(); 
    } 
} 

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

ответ

1

Для того, чтобы ваше представление обновилось при изменении свойств на MyViewModel, этот класс должен реализовать INotifyPropertyChanged. Вот пример:

public class MyViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

Но важно вы должны вызвать OnPropertyChanged в своих сеттеров, так что ваш SelectedItem свойство нужно будет выглядеть примерно так:

MyItem _selectedItem; 
MyItem SelectedItem { 
    get { 
    return _selectedItem; 
    } 
    set { 
    _selectedItem = value; 
    OnPropertyChanged("SelectedItem"); 
    } 
} 

Много полезной информации о MVVM в Xamarin Формы здесь: From Data Bindings to MVVM

+0

Как я писал: Я пробовал это («играл с изменением свойств»). Проблема была в освещении. –

+0

@ Sven-MichaelStübe Я вижу это сейчас. Мои извинения, я пропустил последний абзац вашего вопроса. Вероятно, вы захотите реализовать INotifyPropertyChanged, но это не решит вашу текущую проблему. Что произойдет, если вы установите SelectedItem = "{Binding SelectedItem, Mode = TwoWay}"? –

+0

Я попробую. Связывание работает, по крайней мере, с точки зрения модели, так что это немного странно. Я никогда не видел «OneWayToSource» в качестве режима привязки по умолчанию. Я могу предоставить образец проекта, если у меня будет время. –