XAML 在ListView DataTemplate内选择控件时选择关联的ListViewItem

7gyucuyw  于 2022-12-07  发布在  其他
关注(0)|答案(2)|浏览(153)

我有一个显示项目列表的WinUI 3 ListView。每个项目都有一个ToggleSwitch和一个Expander。当我单击ToggleSwitch或Expander时,ListView的选择不会改变。
我找到了一些WPF的解决方案,但它们在WinUI 3中不起作用:
选择列表框中的文本框项不会更改列表框的选定项
我如何为WinUI 3执行此操作,以便在选择ToggleSwitch或Expander时选择关联的ListViewItem?

nhaq1z21

nhaq1z211#

您可以行程ExpanderToggleSwitchTapped事件,并以程序设计方式设定ListViewSelectedItem属性:

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>
pdkcd3nj

pdkcd3nj2#

如果您不想在以编程方式执行某些操作时更改选择,可以使用这种方法。

  • . xaml格式*
<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>
  • . xaml. cs文件系统*
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;
    }
}
    • 视图模型. cs**
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事件来使项目被选中。但不幸的是,ToggleSwitchTapped事件没有被触发(至少在我的环境中)。可能是一个WinUIbug(问题发布here)。
作为一种解决方法,至少在这个bug得到修复之前,可以使用ToggleButton。我测试了它,Tapped事件被激发了。
第一个

相关问题