我有一個應用程序需要顯示一組行被一些外部條件過濾。由於我在這裏不解釋的原因,我不想從DataGrid綁定的DataTable中刪除行。要篩選列表,我正在摺疊不想顯示的行。這很好,直到用戶對DataGrid進行排序。排序完成後,摺疊的行會再次突然顯示。我查找了一個Sorted事件,以便我可以重新摺疊我需要的行,但只有一個Sorting事件。我試圖在每個DataGridRow上使用IsVisibleChanged,但這似乎並沒有被解僱。我該如何解決這個問題?如何防止DataGridRow更改時排序我的DataGrid?
這是問題的一個簡單的演示:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataTable table = new DataTable();
table.Columns.Add("Column 1");
DataRow row = table.NewRow();
row[0] = "1";
table.Rows.Add(row);
row = table.NewRow();
row[0] = "2";
table.Rows.Add(row);
row = table.NewRow();
row[0] = "3";
table.Rows.Add(row);
_grid.ItemsSource = table.AsDataView();
_grid.DataContext = table;
_grid.Loaded += _grid_Loaded;
}
void _grid_Loaded(object sender, RoutedEventArgs e)
{
var dataGridRow = GetRow(_grid, 1);
dataGridRow.Visibility = Visibility.Collapsed;
dataGridRow = GetRow(_grid, 0);
dataGridRow.Visibility = Visibility.Collapsed;
}
public DataGridRow GetRow(DataGrid grid, int index)
{
var row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index);
if (row == null)
{
// May be virtualized, bring into view and try again.
grid.UpdateLayout();
if (grid.Items.Count > index)
{
grid.ScrollIntoView(grid.Items[index]);
row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index);
}
}
return row;
}
}
這裏是XAML:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<DataGrid HorizontalAlignment="Left" Margin="54,43,0,0" VerticalAlignment="Top" Height="216" Width="382" Name="_grid"/>
</Grid>
運行程序後,你會看到一個DataGrid只數3.單擊「列1」按列排序,注意您現在有數字1,2和3.
任何幫助解決這個問題將不勝感激。
德里克,感謝您的快速回復。我現在檢查鏈接。 – guxiyou