我正在使用像这样的 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 以便默认选择部分(或全部)项目?
我应该使用的数据模板中有特殊值吗?
您可以在
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 包,但我希望这能让您了解如何解决问题。