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];
}
}