动态添加和删除 GridViewColumns 时,我遇到了 WPF Listview 问题。如果我从 ListView 中删除一些列,然后添加删除的列,则添加的列不可见!
我正在删除这样的列。
List<GridViewColumn> gvLists;
for (int i = 0; i < grdView.Columns.Count; i++)
{
// keeping the grdView cols in to a list for later adding back
gvLists.Add(grdView.Columns[i]);
}
// here removing the columns from ListView.GridView
foreach (GridViewColumn g in gvLists)
{
if (g.Header.ToString() != "ID")
{
grdView.Columns.Remove(g);
}
}
然后像这样添加回那些cols
foreach (GridViewColumn g in gvLists)
{
if(!grdView.Columns.Contains(g)) grdView.Columns.Add(g);
}
但是这些添加的列在 ListView 中不可见。但是如果调试并检查列,所有添加的列都在那里。为什么添加的列不可见?
添加这些列后,我尝试调用 InvalidateMeasure 和 Arrange。但是没有用。
我还注意到另一件事是,ListView Loaded 事件被触发了好几次!!
我将 ListView 与 DataSet 中的 DataTable 绑定,而不是使用 MVVM。
还有一件事是,我对所有列都使用了 HeaderTemplates,如下所示:
<GridViewColumn Width="50" Header="Name">
<GridViewColumn.HeaderTemplate>
<DataTemplate>
<DockPanel>
<TextBlock Height="23" TextAlignment="Center" Text="Name" Width="80"/>
<Path Name="SortArrow" StrokeThickness="1" Fill="Gray" Data="M 5,5 L 10,10 L 15,5 L 5,5" Visibility="Collapsed"/>
</DockPanel>
</DataTemplate>
</GridViewColumn.HeaderTemplate>
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding Name.....}" Width="20" Height="15" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
列删除和添加是由窗口中复选框的检查值触发的。如果我选中该复选框,我将调用 RemoveCols(),并在取消选中时调用 AddCols()。