2013-11-02 104 views
1

當動態添加和刪除GridViewColumns時,WPF Listview有問題。 如果我從ListView中刪除一些列,然後添加刪除的列,添加的列是不可見的!WPF 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()。

+0

是要添加文本列的列? –

+0

是的。每列都有一個頭文件模板和一個已定義的單元格模板。如果列的標題模板包含文本框,則其單元格模板具有文本框。如果列的標題模板包含組合框,則其單元格模板具有組合框。 – James

+0

'我將ListView與DataSet中的DataTable綁定在一起,而不是使用MVVM。「 - 通過嘗試強制WPF轉換爲Winforms方法,您正在浪費時間。你會失敗。 WPF不支持winforms思路的開發人員。在2個獨立的UserControls中創建2個獨立的ListView,並在複選框被選中時使用ContentPresenter在它們之間切換。您並不需要將過程代碼中的列添加到ListView中。 –

回答

0

試試這個

foreach (GridViewColumn g in gvLists) 
     { 
      if (!grdView.Columns.Contains(g)) 
      { 
       g = new GridViewColumn(); 
       grdView.Columns.Add(g); 
      } 
     } 
+0

不能使用g = new GridViewColumn(),因爲g在foreach迭代中。 – James

+0

這是什麼錯? –