[WPF] DataGridの末尾行を非表示にする方法

更新:

WPFのDataGridコントロールを使うとき、データの挿入の仕方によっては、末尾に空白行ができてしまうことがあります。今回はこれを非表示にする方法を紹介します。

ItemsSourceにObservableCollectionを指定した場合は末尾に空白行ができる

DataGridコントロールに行を挿入する方法はいくつかありますが、例えば以下のようにObservableCollectionを使うと末尾に空白行ができてしまいます。動作には特に悪影響が発生するわけではないのですが、なんとなく見た目がよくないように感じます。

DataGridコントロールの末尾行を非表示にする方法

XML

<DataGrid x:Name="datagrid1" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="ID" Width="80" Binding="{Binding Id}" />
        <DataGridTextColumn Header="名前" Width="100" Binding="{Binding Name}" />
    </DataGrid.Columns>                        
</DataGrid>

C#

public partial class MainWindow : Window {

		public MainWindow() {
			InitializeComponent();

			var mydataList = new ObservableCollection<MyData> {
				new MyData { Id = 1, Name = "Apple" },
				new MyData { Id = 2, Name = "Banana" },
				new MyData { Id = 3, Name = "Orange" },
			};
			datagrid1.ItemsSource = mydataList;
		}
	}
}
class MyData {
	public int Id { get; set; }
	public string Name{ get; set; }
}

IsReadOnly属性を使って非表示にする

この末尾の空白行を非表示にするにはDataGridコントロールのIsReadOnly属性にTrueを指定します。ただし、この方法はユーザー操作によるセルの編集が制御されます。

XML

<DataGrid x:Name="datagrid1" AutoGenerateColumns="False" IsReadOnly="True">
    <DataGrid.Columns>
        <DataGridTextColumn Header="ID" Width="80" Binding="{Binding Id}" />
        <DataGridTextColumn Header="名前" Width="100" Binding="{Binding Name}" />
    </DataGrid.Columns>                        
</DataGrid>

DataGridコントロールの末尾行を非表示にする方法

CanUserAddRows属性を使って非表示にする

ユーザー操作によるセルの編集を許可したまま、末尾の空白行を非表示にするにはCanUserAddRows属性にFalseを指定します。ユーザーがアクティブセルをクリックすることで編集モードになります。

XML

<DataGrid x:Name="datagrid1" AutoGenerateColumns="False" CanUserAddRows="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="ID" Width="80" Binding="{Binding Id}" />
        <DataGridTextColumn Header="名前" Width="100" Binding="{Binding Name}" />
    </DataGrid.Columns>                        
</DataGrid>

DataGridコントロールの末尾行を非表示にする方法