我有一个包含组和组标题的 ListView,这是我根据某个 WPF tutorial 编写的.
此功能正常,但如果我关闭它所在的窗口并通过重新创建它(创建一个新实例)重新打开它,那么所有标题都会重复。 IE。而不是有“我的标题”和它下面的项目,我有“我的标题”,另一个“我的标题”在它下面,项目在那个下面。 此时重新打开它会添加第三个标题。 如果我切换到不同的项目来源,同样的事情会在那里发生,而且它似乎记得每个来源有多少次重复。
请注意,我在任何时候都绝对不会更改源集合的内容。在各个阶段对其进行序列化会产生完全相同的文件。同时, header 仅根据数据中的字符串值创建;我什至不知道这怎么会导致任何递归,但显然它会。
如果我不重新创建窗口而是重用它并在显示它时更新绑定(bind),则不再出现此问题,但相反地,打开具有不同项目源的窗口现在显示的项目根本没有组标题。
我曾尝试查找任何类似的问题,但无济于事,而且我是 WPF 的新手,所以我还不熟悉它的工作原理。
以下是两种状态下窗口的屏幕截图,以及其中的可视化树和标题:
我确实找到了 this seemingly not-that-related question并随后尝试使用 CollectionViewSource
但我也无法使其正常工作 - 它显示的 super 组表现正常,但在其下发生了完全相同的现象。
这是 ListView 的 XAML 代码:
<ListView
x:Name="lvComponents" Grid.Row="1"
ItemsSource="{Binding ScriptComponents}"
SelectionChanged="LvComponents_SelectionChanged"
lvl:ListViewLayoutManager.Enabled ="True"
IsSynchronizedWithCurrentItem="True"
externals:GridViewSort.AutoSort="True"
externals:GridViewSort.SortGlyphAscending="/Resources/Program Icons/Sort Up.png"
externals:GridViewSort.SortGlyphDescending="/Resources/Program Icons/Sort Down.png">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="Height" Value="36" />
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView>
<GridViewColumn lvl:FixedColumn.Width="36">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding Path=., Converter={StaticResource ComponentToIconPathConverter}}" Width="32"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Name" lvl:ProportionalColumn.Width="1" externals:GridViewSort.PropertyName="Name">
<GridViewColumn.CellTemplate>
<DataTemplate>
<ctl:EditableTextBlock Text="{Binding Name}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Type" lvl:ProportionalColumn.Width="1" externals:GridViewSort.PropertyName="Type">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Type}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
<ListView.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Expander IsExpanded="True" x:Name="xpComponents">
<Expander.Header>
<StackPanel Orientation="Horizontal">
<Image Source="{Binding Name, Converter={StaticResource StringToProgramIconPathConverter}}" Width="16" Margin="0,0,2,0"/>
<TextBlock Text="{Binding Name}" FontWeight="Bold" FontSize="14" VerticalAlignment="Bottom" />
<TextBlock Text=" (" FontSize="14" VerticalAlignment="Bottom" />
<TextBlock Text="{Binding ItemCount}" FontSize="14" VerticalAlignment="Bottom" />
<TextBlock Text=")" FontSize="14" VerticalAlignment="Bottom" />
</StackPanel>
</Expander.Header>
<ItemsPresenter />
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</ListView.GroupStyle>
</ListView>
对于此原因的任何想法,甚至是解决方法,我们将不胜感激。
如果我可以重用窗口而不是重新创建它会更好(现在导致标题在更改源时根本不显示),但我会尽我所能。
提前致谢。 =)
最佳答案
我找到了解决方案。如果我使用
List<User> itemssss = new List<User>();
if (lvUsers.ItemsSource != null)
itemssss = (List<User>)lvUsers.ItemsSource;
items.Add(new User() { Name = DateTime.Now.Ticks.ToString(), Age = 42, Sex = "Male" });
lvUsers.ItemsSource = items;
CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(lvUsers.ItemsSource);
PropertyGroupDescription groupDescription = new PropertyGroupDescription("Sex");
view.GroupDescriptions.Add(groupDescription);
然后Header多次显示。但是如果我使用
List<User> itemssss = new List<User>();
if (lvUsers.ItemsSource != null)
itemssss = (List<User>)lvUsers.ItemsSource;
List<User> items = new List<User>();
foreach (var item in itemssss)
{
items.Add(item);
}
items.Add(new User() { Name = DateTime.Now.Ticks.ToString(), Age = 42, Sex = "Male" });
lvUsers.ItemsSource = items;
CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(lvUsers.ItemsSource);
PropertyGroupDescription groupDescription = new PropertyGroupDescription("Sex");
view.GroupDescriptions.Add(groupDescription);
对我来说很好用
https://stackoverflow.com/questions/54430954/
相关文章:
python - 如何在 django 中使用 ajax 形式验证 django-recaptcha
angular - 如何在 ngrx 效果中使用 LatestFrom 进行单元测试
Python:DataFrame.melt - 如何选择一系列列作为标识符变量?
java - soap 请求 java 中缺少 header
spring-boot - 如何在 Spring Security oauth2 中调试重定向 ur
javascript - 为什么 Chrome 在使用 Typed.js 时难以呈现表情符号?
ruby-on-rails - rake 数据库 :setup is giving Library
python - 如何在 Mac 上将 Python 完全恢复为出厂设置