いくつかの外部基準によってフィルタリングされた一連の行を表示する必要があるアプリケーションがあります。ここでは説明しませんが、DataGridがバインドされているDataTableから行を削除したくありません。リストをフィルタリングするために、表示したくない行を折りたたんでいます。これは、ユーザーがDataGridを並べ替えるまではうまく機能します。並べ替えが完了すると、折りたたまれた行が突然再び表示されます。必要な行を再度折りたたむことができるように、Sortedイベントを探しましたが、Sortingイベントしかありません。各DataGridRowでIsVisibleChangedを使用しようとしましたが、これは起動していないようです。この問題を解決するにはどうすればよいですか?
問題の簡単なデモを次に示します。
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>
プログラムを実行すると、番号3のみのDataGridが表示されます。[列1]をクリックして列で並べ替えると、番号1、2、および3が表示されます。
この問題を解決するための助けをいただければ幸いです。