我正在尝试更改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.
更多推荐
发布评论