WPF Command DataGridの操作 - TakanoriMukai/MyNotes GitHub Wiki
ObservableCollectionを使う。
ObserbableCollectionはINotifyCollectionChangedを実装しているので、
コレクションに対して追加、削除といった操作を行った際に変更をバインド先に通知することができる。
→Viewを更新できる!
適当に用意
public class Model
{
public int Id { get; set; }
public string Name { get; set; }
}
public class MainViewModel : INotifyPropertyChanged
{
// データグリッド操作用のコマンド
public MyCommand MyCommand { get; } = new MyCommand();
private ObservableCollection<Model> models;
public ObservableCollection<Model> Models
{
get { return models; }
set
{
if (models != value)
{
models = value;
NotifyPropertyChanged("Models");
}
}
}
}
Commandの引数にDataGridを指定する
public class MyCommand : ICommand
{
public void Execute(object parameter)
{
var dataGrid = parameter as DataGrid;
var models = dataGrid.ItemsSource as ObservableCollection<Model>;
foreach (Model m in models)
{
Console.WriteLine(m.ToString());
}
// ソート
var ordered = new ObservableCollection<Model>(models.OrderByDescending(m => m.Id));
foreach (Model m in ordered)
{
Console.WriteLine(m.ToString());
}
dataGrid.ItemsSource = ordered;
}
}
<Window x:Class="LINQtest01.MainWindow"
...
Name="mainWindow">
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<Grid>
<Button x:Name="button1" Content="Button"
HorizontalAlignment="Left" Margin="10,35,0,0" VerticalAlignment="Top" Width="75"
Command="{Binding MyCommand}" CommandParameter="{Binding ElementName=dataGrid}"/>
<DataGrid x:Name="dataGrid"
HorizontalAlignment="Left" Margin="10,59,0,0" VerticalAlignment="Top" Height="252" Width="499"
AutoGenerateColumns="False" // バインドするデータに合わせ列が自動生成されないようにする。
ItemsSource="{Binding Models}">
<DataGrid.Columns>
<DataGridTextColumn Header="ID"
Binding="{Binding Id}"
Width="100"
IsReadOnly="True" />
<DataGridTextColumn Header="名前"
Binding="{Binding Name}"
Width="100"
IsReadOnly="True" />
</DataGrid.Columns>
</Grid>
</Window>