WinUI3 列表查看所选项目

问题描述 投票:0回答:1

我正在使用像这样的 WinUI3 ListView 来加载文件列表:

<ListView ItemTemplate="{StaticResource Template2}"
 ItemsSource="{x:Bind Files,Mode=OneWay}"  
IsItemClickEnabled="True" x:Name="List2" SelectionMode="Multiple" />
 <DataTemplate x:Key="Template2" x:DataType="local:FileItem">
        <Grid>
         .... TextBlocks that bind to properties in FileItem
         </Grid>
</DataTemplate>

现在,如何配置我的 DataTemplate 以便默认选择部分(或全部)项目?

我应该使用的数据模板中有特殊值吗?

xaml winrt-xaml winui-3
1个回答
0
投票

您可以在

ListViewItem
中使用
ItemTemplate

假设您的

FileItem
看起来像这样:

public partial class FileItem : ObservableObject
{
    [ObservableProperty]
    private string _name = string.Empty;

    [ObservableProperty]
    private bool _isSelected;
}

和你的 ViewModel:

public partial class  MainPageViewModel : ObservableObject
{
    [ObservableProperty]
    private ObservableCollection<FileItem> _files = new()
    {
        new FileItem { Name = "File1" },
        new FileItem { Name = "File2", IsSelected = true, },
        new FileItem { Name = "File3"},
    };
}

在 XAML 中:

<Page.Resources>
    <DataTemplate
        x:Key="Template2"
        x:DataType="local:FileItem">
        <ListViewItem IsSelected="{x:Bind IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <TextBlock Text="{x:Bind Name, Mode=OneWay}" />
        </ListViewItem>
    </DataTemplate>
</Page.Resources>
<ListView
    Grid.Row="1"
    IsItemClickEnabled="True"
    ItemTemplate="{StaticResource Template2}"
    ItemsSource="{x:Bind ViewModel.Files, Mode=OneWay}"
    SelectionMode="Multiple" />

但不幸的是,这不起作用,因为加载时

ListViewItem
会将其
IsSelected
属性重置为
false
。我不确定这是一个错误还是设计使然。

作为解决方法,您可以在加载每个

ListViewItem
后进行绑定:

<Page.Resources>
    <DataTemplate
        x:Key="Template2"
        x:DataType="local:FileItem">
        <ListViewItem Loaded="ListViewItem_Loaded">
            <TextBlock Text="{x:Bind Name, Mode=OneWay}" />
        </ListViewItem>
    </DataTemplate>
</Page.Resources>

然后在代码隐藏中:

private void ListViewItem_Loaded(object sender, RoutedEventArgs e)
{
    if (sender is not ListViewItem listViewItem)
    {
        return;
    }

    listViewItem.SetBinding(
        ListViewItem.IsSelectedProperty,
        new Binding
        {
            Path = new PropertyPath("IsSelected"),
            Mode = BindingMode.TwoWay,
            Source = listViewItem.DataContext,
            UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
        });
}

顺便说一句,我正在为 ViewModel 使用 CommunityToolkit.Mvvm NuGet 包,但我希望这能让您了解如何解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.