Android 表单列表视图集合按代码选择编辑项

Android 表单列表视图集合按代码选择编辑项,android,listview,xamarin,xamarin.forms,selecteditem,Android,Listview,Xamarin,Xamarin.forms,Selecteditem,如何在代码中设置列表视图的SelectedItem?我的问题是,当我在代码中预选一个项目时,它没有突出显示。ListView是在xaml文件中定义的 <ListView ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" /> 我的视图模型 class MyViewModel { List<MyItem> Items {get; set;} MyItem Select

如何在代码中设置列表视图的
SelectedItem
?我的问题是,当我在代码中预选一个项目时,它没有突出显示。ListView是在xaml文件中定义的

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

我的视图模型

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

    public MyViewModel() 
    {
        Items = new List<MyItem>{ ... };
        SelectedItem = Items.First();
    }
}
类MyViewModel
{
列表项{get;set;}
MyItem SelectedItem{get;set;}
公共MyViewModel()
{
Items=新列表{…};
SelectedItem=Items.First();
}
}

但是当我显示视图时,它并没有高亮显示所选项目。当我点击一个项目时,它会高亮显示并正确设置。我已经尝试过更改属性,但这不应该产生效果,因为该属性在构造函数中设置正确。

为了在
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));
    }
}
但重要的是,您必须在setters中调用
OnPropertyChanged
,因此您的
SelectedItem
属性需要如下所示:

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

这里有很多关于Xamarin表单中MVVM的好信息:

在我的例子中,就是这样。。。。(例如,使用一个元素自动选择第一个元素)


正如我写的:我尝试过这个(“玩弄改变的财产”)。问题在于我现在明白了。对不起,我错过了你问题的最后一段。您可能希望实现INotifyPropertyChanged,但这并不能解决当前的问题。如果设置SelectedItem=“{Binding SelectedItem,Mode=TwoWay}”,会发生什么?我会试试。绑定至少从视图到模型都在工作,所以有点奇怪。我从未见过
OneWayToSource
作为默认绑定模式。我可以提供一个样本项目,如果我有时间。同意,这将是一个奇怪的默认。可能会有帮助。是的,我见过这种行为。我只是忽略绑定属性中的
null
值(例如,来自绑定初始化的值),因为在我的列表中始终有一个选定项。
 protected override async void OnAppearing()
{
    if (MyList.Count == 1)
                {
                    List_CheckPoint.SelectedItem = MyList[0];
                }
    }