UWP技术问题:点击ListViewItem内按钮时如何选中该项
解决UWP中点击ListViewItem内按钮选中对应项的问题
嗨,我明白你遇到的困扰——WPF里用触发器就能轻松搞定的事,到UWP这儿因为样式触发器的限制就行不通了。别担心,我给你两种实用的解决办法,分别适合代码后台和MVVM模式的场景:
方法一:通过VisualTreeHelper在后台代码中查找父项
你可以在按钮的Click事件里,利用VisualTreeHelper向上遍历可视化树,找到对应的ListViewItem,然后手动设置它的IsSelected属性为true。
示例代码如下:
private void Button_Click(object sender, RoutedEventArgs e) { Button clickedButton = sender as Button; if (clickedButton == null) return; // 向上查找父级的ListViewItem DependencyObject parent = VisualTreeHelper.GetParent(clickedButton); while (parent != null && !(parent is ListViewItem)) { parent = VisualTreeHelper.GetParent(parent); } ListViewItem targetItem = parent as ListViewItem; if (targetItem != null) { targetItem.IsSelected = true; } }
在XAML里给按钮绑定这个点击事件就行:
<ListView> <ListView.ItemTemplate> <DataTemplate> <StackPanel> <TextBlock Text="{Binding YourProperty}" /> <Button Content="选中该项" Click="Button_Click" /> </StackPanel> </DataTemplate> </ListView.ItemTemplate> </ListView>
方法二:MVVM模式下通过绑定实现(更推荐)
如果你的项目用了MVVM,那可以通过绑定SelectedItem和命令来实现,这样不用写后台代码,更符合UWP的最佳实践。
- 首先在ViewModel里定义
SelectedItem属性和一个命令:
public class YourViewModel : INotifyPropertyChanged { private YourDataModel _selectedItem; public YourDataModel SelectedItem { get => _selectedItem; set { _selectedItem = value; OnPropertyChanged(nameof(SelectedItem)); } } public ICommand SelectItemCommand { get; } public YourViewModel() { SelectItemCommand = new RelayCommand<YourDataModel>(item => { SelectedItem = item; }); } // 实现INotifyPropertyChanged接口的代码 public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
(注:这里的RelayCommand是常见的命令实现类,你可以自己写一个或者用MVVM框架里的实现)
- 然后在XAML里绑定
ListView的SelectedItem,同时给按钮的Command和CommandParameter赋值:
<ListView ItemsSource="{Binding YourDataList}" SelectedItem="{Binding SelectedItem}"> <ListView.ItemTemplate> <DataTemplate> <StackPanel> <TextBlock Text="{Binding YourProperty}" /> <Button Content="选中该项" Command="{Binding DataContext.SelectItemCommand, RelativeSource={RelativeSource AncestorType=ListView}}" CommandParameter="{Binding}" /> </StackPanel> </DataTemplate> </ListView.ItemTemplate> </ListView>
这里通过RelativeSource找到ListView的DataContext,拿到ViewModel里的命令,然后把当前项作为参数传进去,执行命令时就会把SelectedItem设为当前项,从而选中对应的ListViewItem。
这两种方法都能完美解决你的问题,根据你的项目架构选合适的就行~
内容的提问来源于stack exchange,提问作者Alexey Titov
相关产品推荐
相关产品推荐

