Xamarin Forms中ListView SelectedItem无法获取正确值的求助
嘿,我懂你现在的困扰——选中ListView的TextCell后,调用SearchResults.SelectedItem.ToString()得到的却是模型类的完整路径(比如YourNamespace.Post),而不是你想要的OBJUNIQUEID实际值。这是因为默认情况下,object.ToString()方法返回的就是对象的类型标识,而不是你绑定的属性值。下面给你几个解决方向:
方法1:将SelectedItem转换为Post模型实例后访问属性
这是最直接的方式,因为SelectedItem本质上是你绑定的Post对象,所以只需要把它转换成对应类型,就能直接获取属性值。修改你的SearchResults_ItemSelected事件处理代码:
private void SearchResults_ItemSelected(object sender, SelectedItemChangedEventArgs e) { // 先判断选中的项是否为Post类型 if (e.SelectedItem is Post selectedPost) { // 直接访问OBJUNIQUEID属性 CredoConsole.Text = $"Item Selected: {selectedPost.OBJUNIQUEID}"; } }
另外注意,你当前的C#代码里直接给SearchResults.ItemsSource赋值后就去取SelectedItem,这时候可能还没有选中项,所以最好把赋值操作放到事件处理方法里,而不是初始化的时候。
方法2:重写Post类的ToString()方法
如果你希望直接调用ToString()就能得到想要的值,可以在你的Post模型类里重写ToString()方法:
public class Post { // 你的其他数据库字段属性... public string OBJUNIQUEID { get; set; } // 重写ToString(),返回你需要的属性值 public override string ToString() { return OBJUNIQUEID; } }
这样之后,原来的SearchResults.SelectedItem.ToString()就会直接返回OBJUNIQUEID的值,不需要额外转换。
额外提示:规范的MVVM绑定方式
看你的XAML里写了SelectedItem="{Binding OBJUNIQUEID, Mode=TwoWay}",这里其实有个小问题——SelectedItem应该绑定到一个Post类型的属性,而不是直接绑定到字符串类型的OBJUNIQUEID。如果用MVVM模式开发,建议在ViewModel里定义一个选中项的属性:
ViewModel代码
private Post _selectedPost; public Post SelectedPost { get => _selectedPost; set { _selectedPost = value; OnPropertyChanged(); // 需要实现INotifyPropertyChanged接口 if (_selectedPost != null) { CredoConsole.Text = $"Item Selected: {_selectedPost.OBJUNIQUEID}"; } } }
修改XAML
<ListView x:Name="SearchResults" ItemsSource="{Binding Post}" ItemSelected="SearchResults_ItemSelected" SelectedItem="{Binding SelectedPost, Mode=TwoWay}"> <ListView.ItemTemplate> <DataTemplate> <TextCell Height="15" TextColor="Black" Text="{Binding OBJUNIQUEID}"/> </DataTemplate> </ListView.ItemTemplate> </ListView>
这种方式更符合Xamarin Forms的MVVM开发规范,也能更优雅地处理选中项的逻辑。
内容的提问来源于stack exchange,提问作者Callum McAlister

