我有一个显示项目列表的WinUI 3 ListView。每个项目都有一个ToggleSwitch和一个Expander。当我单击ToggleSwitch或Expander时,ListView的选择不会改变。我找到了一些WPF的解决方案,但它们在WinUI 3中不起作用:选择列表框中的文本框项不会更改列表框的选定项我如何为WinUI 3执行此操作,以便在选择ToggleSwitch或Expander时选择关联的ListViewItem?
nhaq1z211#
您可以行程Expander和ToggleSwitch的Tapped事件,并以程序设计方式设定ListView的SelectedItem属性:
Expander
ToggleSwitch
Tapped
ListView
SelectedItem
private void OnTapped(object sender, TappedRoutedEventArgs e) { FrameworkElement element = (FrameworkElement)sender; lv.SelectedItem = element.DataContext; }
XAML文件:
<ListView x:Name="lv"> <ListView.ItemTemplate> <DataTemplate> ... <Expander Tapped="OnTapped" ... /> </DataTemplate> </ListView.ItemTemplate> </ListView>
pdkcd3nj2#
如果您不想在以编程方式执行某些操作时更改选择,可以使用这种方法。
<StackPanel> <Button Command="{x:Bind ViewModel.TestCommand}" Content="Click" /> <ListView x:Name="ListViewControl" ItemsSource="{x:Bind ViewModel.Items}" SelectionMode="Single"> <ListView.ItemTemplate> <DataTemplate x:DataType="local:Item"> <StackPanel> <ToggleSwitch Toggled="ToggleSwitch_Toggled" /> <Expander Expanding="Expander_Expanding" IsExpanded="{x:Bind IsChecked, Mode=OneWay}" /> </StackPanel> </DataTemplate> </ListView.ItemTemplate> </ListView> </StackPanel>
private void ToggleSwitch_Toggled(object sender, RoutedEventArgs e) { if (ViewModel.IsProgrammatical is false) { ListViewControl.SelectedItem = (sender as ToggleSwitch)?.DataContext; } } private void Expander_Expanding(Expander sender, ExpanderExpandingEventArgs args) { if (ViewModel.IsProgrammatical is false) { ListViewControl.SelectedItem = sender.DataContext; } }
public partial class Item : ObservableObject { [ObservableProperty] private string text = string.Empty; [ObservableProperty] private bool isChecked; } public partial class MainWindowViewModel : ObservableObject { public bool IsProgrammatical { get; set; } [ObservableProperty] private List<Item> items = new() { { new Item() { Text = "A", IsChecked = false,} }, { new Item() { Text = "B", IsChecked = false,} }, { new Item() { Text = "C", IsChecked = false,} }, }; [RelayCommand] private void Test() { IsProgrammatical = true; Items[1].IsChecked = !Items[1].IsChecked; IsProgrammatical = false; } }
在这种情况下,源集合是不可触及的,我们不能使用一个标志,如果属性被编程更改或没有,我们需要使用Tapped事件来使项目被选中。但不幸的是,ToggleSwitch的Tapped事件没有被触发(至少在我的环境中)。可能是一个WinUIbug(问题发布here)。作为一种解决方法,至少在这个bug得到修复之前,可以使用ToggleButton。我测试了它,Tapped事件被激发了。第一个
ToggleButton
2条答案
按热度按时间nhaq1z211#
您可以行程
Expander
和ToggleSwitch
的Tapped
事件,并以程序设计方式设定ListView
的SelectedItem
属性:XAML文件:
pdkcd3nj2#
如果您不想在以编程方式执行某些操作时更改选择,可以使用这种方法。
在这种情况下,源集合是不可触及的,我们不能使用一个标志,如果属性被编程更改或没有,我们需要使用
Tapped
事件来使项目被选中。但不幸的是,ToggleSwitch
的Tapped
事件没有被触发(至少在我的环境中)。可能是一个WinUIbug(问题发布here)。作为一种解决方法,至少在这个bug得到修复之前,可以使用
ToggleButton
。我测试了它,Tapped
事件被激发了。第一个