【发布时间】:2018-05-02 13:15:12
【问题描述】:
似乎没有办法让初始选择显示在 Xamarin Forms ListView 中。我看到这个问题已经被问过几次,但是在每种情况下都没有相关的答案,或者未回答的问题太复杂而无法正确分析,或者问题得到了回答但答案不起作用。所以我想我会提出这个问题的简化版本,希望有人能告诉我一个解决方法。一个解决方法就是可以做的所有事情,因为很明显 SelectedItem 不能被绑定并且不能从代码中设置。这是我检查过的 SO 问题...
:Why can't I set the SelectedItem property of Xamarin.Forms.ListView?
Xamarin Forms ListView SelectedItem Binding Issue
Xamarin.Forms ListView set SelectedItem by Code
Xamarin XAML ListView - How to select programatically
这里是 XAML...
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:XamarinFormsBench"
x:Class="XamarinFormsBench.ListViewPage1">
<ContentPage.BindingContext>
<local:ViewModel1/>
</ContentPage.BindingContext>
<ListView x:Name="MyListView" Margin="0,20,0,0"
ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
BindingContextChanged="MyListView_BindingContextChanged">
</ListView>
</ContentPage>
这里是代码...
public class Item
{
public Item(string name, string description)
{
Name = name;
Description = description;
}
string Name { get; set; }
string Description { get; set; }
public override string ToString()
{
return Name + " = " + Description;
}
}
public class ViewModel1 : INotifyPropertyChanged
{
public ObservableCollection<Item> Items { get; set; }
public ViewModel1()
{
Items = new ObservableCollection<Item>
{
new Item("Item 1","First item"),
new Item("Item 2","Second item"),
new Item("Item 3","Third item"),
new Item("Item 4","Fourth item"),
new Item("Item 5","Fifth item")
};
_selectedItem = Items[2];
}
Item _selectedItem;
public event PropertyChangedEventHandler PropertyChanged;
public Item SelectedItem
{
get
{
return _selectedItem;
}
set
{
_selectedItem = value;
NotifyPropertyChanged(nameof(SelectedItem));
}
}
public void NotifyPropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class ListViewPage1 : ContentPage
{
public ListViewPage1()
{
InitializeComponent();
}
public ViewModel1 ViewModel
{
get
{
return BindingContext as ViewModel1;
}
}
private void MyListView_BindingContextChanged(object sender, EventArgs e)
{
// MyListView.SelectedItem = ViewModel.SelectedItem;
}
}
我的期望是出现 5 个项目的列表,并突出显示第 3 个项目。发生的情况是出现 5 个项目,但没有突出显示任何项目。绑定显然有效,因为每次单击项目时都会更新所选项目。
现在,如果我删除绑定并尝试通过取消注释接近末尾的行来在代码中设置所选项目,那也不起作用。
所以我没有想法。我一直在研究模拟鼠标点击,但这确实超出了我愿意去的地方。
我已在 UWP 和 Android 上运行此代码。没试过iOS。
【问题讨论】:
-
尝试将
_selectedItem = Items[2];更改为SelectedItem = Items[2];。当您直接编辑私有字段时,您会丢失 propertyChange 事件通知。 -
试过了。没有变化,特别是因为该代码位于视图模型构造函数中,因此属性更改事件为空。我还将代码添加到绑定上下文更改的事件处理程序中。我还将 SelectedItem 设置为 null,然后返回 Items[2] 仍然无效。我什么都试过了。
-
好的。尝试用另一个 ItemsControl 替换 ListView。
-
ItemsView 你的意思是?集合视图中除了 ListView 之外只有 Picker 和 TableView。这些都不是 ListView 的替代品。
标签: c# xamarin xamarin.forms