WPF Command DataGridの操作 - TakanoriMukai/MyNotes GitHub Wiki

DataGridをCommandから操作したい!

ObservableCollectionを使う。 ObserbableCollectionはINotifyCollectionChangedを実装しているので、 コレクションに対して追加、削除といった操作を行った際に変更をバインド先に通知することができる。
 →Viewを更新できる!

Model

適当に用意

    public class Model
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

ViewModel

    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

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;
        }
    }

View

<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>
⚠️ **GitHub.com Fallback** ⚠️