Datatrigger改变一个ListView ItemsSource不会触发(Datatrigger to change a ListView ItemsSource not firing)

编程入门 行业动态 更新时间:2024-10-28 02:25:24
Datatrigger改变一个ListView ItemsSource不会触发(Datatrigger to change a ListView ItemsSource not firing)

我正在尝试更改ListView的ItemsSource属性,具体取决于集合是否包含元素或为null。

ListView目前看起来像这样:

<Control.Resources> <Style TargetType="{x:Type GridViewColumnHeader}"> <Setter Property="HorizontalContentAlignment" Value="Left" /> </Style> <Style TargetType="{x:Type ListViewItem}"> <EventSetter Event="MouseDoubleClick" Handler="GridFiles_MouseDoubleClick" /> </Style> <CollectionViewSource x:Key="DirectoryFiles" Source="{Binding Path=CurrentDirectory.Files}"/> <CollectionViewSource x:Key="DirectorySubDirs" Source="{Binding Path=CurrentDirectory.SubDirectories}"/> <CompositeCollection x:Key="CombinedCollection"> <CollectionContainer Collection="{Binding Source={StaticResource DirectorySubDirs}}" /> <CollectionContainer Collection="{Binding Source={StaticResource DirectoryFiles}}" /> </CompositeCollection> </Control.Resources> <Grid> <ListView x:Name="gridFiles" Grid.Row="2" Grid.Column="1" Margin="2" SelectedItem="{Binding Path=SelectedFileGridItem}" ItemsSource="{StaticResource CombinedCollection}"> <ListView.View> <GridView> <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" /> <GridViewColumn Header="Extension" DisplayMemberBinding="{Binding Extension}" /> <GridViewColumn Header="Checksum" DisplayMemberBinding="{Binding Checksum}" /> </GridView> </ListView.View> </ListView> <Grid>

在我的viewmodel中,有一个名为SearchResults的IEnumerable<FileNodeViewModel>属性,它在执行搜索后填充结果,否则为null。 如果我手动将ListView属性的ItemsSource设置为{Binding SearchResults}则搜索结果按预期显示,因此我确信数据已正确格式化并可用于Listview 。

在这个线程中,我发现了一个类似的问题并附加了xaml代码:

<Control.Resources> <Style TargetType="{x:Type GridViewColumnHeader}"> <Setter Property="HorizontalContentAlignment" Value="Left" /> </Style> <Style TargetType="{x:Type ListViewItem}"> <EventSetter Event="MouseDoubleClick" Handler="GridFiles_MouseDoubleClick" /> </Style> <Style TargetType="ListView"> <Style.Triggers> <DataTrigger Binding="{Binding SearchResults}" Value="All"> <Setter Property="ItemsSource" Value="{Binding SearchResults}" /> </DataTrigger> </Style.Triggers> </Style> <CollectionViewSource x:Key="DirectoryFiles" Source="{Binding Path=CurrentDirectory.Files}"/> <CollectionViewSource x:Key="DirectorySubDirs" Source="{Binding Path=CurrentDirectory.SubDirectories}"/> <CompositeCollection x:Key="CombinedCollection"> <CollectionContainer Collection="{Binding Source={StaticResource DirectorySubDirs}}" /> <CollectionContainer Collection="{Binding Source={StaticResource DirectoryFiles}}" /> </CompositeCollection> </Control.Resources> <Grid> <ListView x:Name="gridFiles" Grid.Row="2" Grid.Column="1" Margin="2" SelectedItem="{Binding Path=SelectedFileGridItem}" ItemsSource="{StaticResource CombinedCollection}"> <ListView.View> <GridView> <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" /> <GridViewColumn Header="Extension" DisplayMemberBinding="{Binding Extension}" /> <GridViewColumn Header="Checksum" DisplayMemberBinding="{Binding Checksum}" /> </GridView> </ListView.View> </ListView> <Grid>

但是,没有任何变化。 无论SearchResults属性是否为null , ListView总是显示组合的集合。 我还尝试创建一个boolan属性来指示是否显示第二个集合,结果如下:

<Style TargetType="ListView"> <Style.Triggers> <DataTrigger Binding="{Binding ShowSearchResults}" Value="True"> <Setter Property="ItemsSource" Value="{Binding SearchResults}" /> </DataTrigger> </Style.Triggers> </Style>

有谁知道我该怎么做才能正确更改ItemsSource属性?

I am trying to change the ItemsSource Property of a ListView, depending on if a collection contains elements or is null.

The ListView currently looks like this:

<Control.Resources> <Style TargetType="{x:Type GridViewColumnHeader}"> <Setter Property="HorizontalContentAlignment" Value="Left" /> </Style> <Style TargetType="{x:Type ListViewItem}"> <EventSetter Event="MouseDoubleClick" Handler="GridFiles_MouseDoubleClick" /> </Style> <CollectionViewSource x:Key="DirectoryFiles" Source="{Binding Path=CurrentDirectory.Files}"/> <CollectionViewSource x:Key="DirectorySubDirs" Source="{Binding Path=CurrentDirectory.SubDirectories}"/> <CompositeCollection x:Key="CombinedCollection"> <CollectionContainer Collection="{Binding Source={StaticResource DirectorySubDirs}}" /> <CollectionContainer Collection="{Binding Source={StaticResource DirectoryFiles}}" /> </CompositeCollection> </Control.Resources> <Grid> <ListView x:Name="gridFiles" Grid.Row="2" Grid.Column="1" Margin="2" SelectedItem="{Binding Path=SelectedFileGridItem}" ItemsSource="{StaticResource CombinedCollection}"> <ListView.View> <GridView> <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" /> <GridViewColumn Header="Extension" DisplayMemberBinding="{Binding Extension}" /> <GridViewColumn Header="Checksum" DisplayMemberBinding="{Binding Checksum}" /> </GridView> </ListView.View> </ListView> <Grid>

In my viewmodel there is an IEnumerable<FileNodeViewModel> property called SearchResults which is filled with results after performing a search, otherwise its null. If I manually set the ItemsSource of the ListView property to {Binding SearchResults} the search results are displayed as intended, so I am sure that the data is correctly formated and available to the Listview.

In this thread I found a similar question and appended the xaml code:

<Control.Resources> <Style TargetType="{x:Type GridViewColumnHeader}"> <Setter Property="HorizontalContentAlignment" Value="Left" /> </Style> <Style TargetType="{x:Type ListViewItem}"> <EventSetter Event="MouseDoubleClick" Handler="GridFiles_MouseDoubleClick" /> </Style> <Style TargetType="ListView"> <Style.Triggers> <DataTrigger Binding="{Binding SearchResults}" Value="All"> <Setter Property="ItemsSource" Value="{Binding SearchResults}" /> </DataTrigger> </Style.Triggers> </Style> <CollectionViewSource x:Key="DirectoryFiles" Source="{Binding Path=CurrentDirectory.Files}"/> <CollectionViewSource x:Key="DirectorySubDirs" Source="{Binding Path=CurrentDirectory.SubDirectories}"/> <CompositeCollection x:Key="CombinedCollection"> <CollectionContainer Collection="{Binding Source={StaticResource DirectorySubDirs}}" /> <CollectionContainer Collection="{Binding Source={StaticResource DirectoryFiles}}" /> </CompositeCollection> </Control.Resources> <Grid> <ListView x:Name="gridFiles" Grid.Row="2" Grid.Column="1" Margin="2" SelectedItem="{Binding Path=SelectedFileGridItem}" ItemsSource="{StaticResource CombinedCollection}"> <ListView.View> <GridView> <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" /> <GridViewColumn Header="Extension" DisplayMemberBinding="{Binding Extension}" /> <GridViewColumn Header="Checksum" DisplayMemberBinding="{Binding Checksum}" /> </GridView> </ListView.View> </ListView> <Grid>

However, nothing changes. No matter if the SearchResults property is null or not, the ListView always displays the combined collection. I also tried to create a boolan property to indicate if the second collection should be displayed or not, with the same result:

<Style TargetType="ListView"> <Style.Triggers> <DataTrigger Binding="{Binding ShowSearchResults}" Value="True"> <Setter Property="ItemsSource" Value="{Binding SearchResults}" /> </DataTrigger> </Style.Triggers> </Style>

Does anybody know how what I should do to correctly change the ItemsSource property?

最满意答案

所以你只想在SearchResults不是null的情况下绑定SearchResults ,否则你想绑定到CombinedCollection ? 然后,您可以使用值为{x:Null}的DataTrigger :

<ListView x:Name="gridFiles" Grid.Row="2" Grid.Column="1" Margin="2" SelectedItem="{Binding Path=SelectedFileGridItem}"> <ListView.Style> <Style TargetType="ListView"> <Setter Property="ItemsSource" Value="{Binding SearchResults}" /> <Style.Triggers> <DataTrigger Binding="{Binding SearchResults}" Value="{x:Null}"> <Setter Property="ItemsSource" Value="{StaticResource CombinedCollection}" /> </DataTrigger> </Style.Triggers> </Style> </ListView.Style> <ListView.View> <GridView> <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" /> <GridViewColumn Header="Extension" DisplayMemberBinding="{Binding Extension}" /> <GridViewColumn Header="Checksum" DisplayMemberBinding="{Binding Checksum}" /> </GridView> </ListView.View> </ListView>

确保您只在Style设置器中设置了ItemsSource属性。

So you want to bind to SearchResults only if it's not null, or else you wan to bind to CombinedCollection? You could then use a DataTrigger with a value of {x:Null}:

<ListView x:Name="gridFiles" Grid.Row="2" Grid.Column="1" Margin="2" SelectedItem="{Binding Path=SelectedFileGridItem}"> <ListView.Style> <Style TargetType="ListView"> <Setter Property="ItemsSource" Value="{Binding SearchResults}" /> <Style.Triggers> <DataTrigger Binding="{Binding SearchResults}" Value="{x:Null}"> <Setter Property="ItemsSource" Value="{StaticResource CombinedCollection}" /> </DataTrigger> </Style.Triggers> </Style> </ListView.Style> <ListView.View> <GridView> <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" /> <GridViewColumn Header="Extension" DisplayMemberBinding="{Binding Extension}" /> <GridViewColumn Header="Checksum" DisplayMemberBinding="{Binding Checksum}" /> </GridView> </ListView.View> </ListView>

Make sure that you only set the ItemsSource property in the Style Setter.

更多推荐

本文发布于:2023-07-14 17:19:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1106063.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:ListView   Datatrigger   ItemsSource   firing   change

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!