web-dev-qa-db-ja.com

DataGrid.ItemsSourceが変更されたときにイベントを発生させる方法

私はWPFの初心者で、DataGridを操作していて、ItemsSourceプロパティがいつ変更されたかを知る必要があります。

たとえば、この命令が実行されると、イベントが発生する必要があることを私は必要とします:

dataGrid.ItemsSource = table.DefaultView;

または、行が追加されたとき。

私はこのコードを使用しようとしました:

CollectionView myCollectionView = (CollectionView)CollectionViewSource.GetDefaultView(myGrid.Items);
((INotifyCollectionChanged)myCollectionView).CollectionChanged += new NotifyCollectionChangedEventHandler(DataGrid_CollectionChanged); 

ただし、このコードは、ユーザーがコレクションに新しい行を追加した場合にのみ機能します。したがって、コレクション全体が置き換えられたため、または単一の行が追加されたために、ItemsSourceプロパティ全体が変更されたときに発生するイベントが必要です。

あなたが助けてくれるといいのですが。前もって感謝します

29
Dante

ItemsSourceは依存関係プロパティであるため、プロパティが別のプロパティに変更されたときに通知を受けるのは簡単です。あなたが持っているコードに加えてこれを使用したいでしょう、代わりに:

Window.Loaded(または同様のもの)のようにサブスクライブできます。

var dpd = DependencyPropertyDescriptor.FromProperty(ItemsControl.ItemsSourceProperty, typeof(DataGrid));
if (dpd != null)
{
    dpd.AddValueChanged(myGrid, ThisIsCalledWhenPropertyIsChanged);
}

そして変更ハンドラがあります:

private void ThisIsCalledWhenPropertyIsChanged(object sender, EventArgs e)
{
}

ItemsSourceプロパティが設定されるたびに、ThisIsCalledWhenPropertyIsChangedメソッドが呼び出されます。

これは、変更について通知するany依存関係プロパティに使用できます。

57
vcsjones

これは役に立ちますか?

public class MyDataGrid : DataGrid
{
    protected override void OnItemsSourceChanged(
                                    IEnumerable oldValue, IEnumerable newValue)
    {
        base.OnItemsSourceChanged(oldValue, newValue);

        // do something here?
    }

    protected override void OnItemsChanged(NotifyCollectionChangedEventArgs e)
    {
        base.OnItemsChanged(e);

        switch (e.Action)
        {
            case NotifyCollectionChangedAction.Add:
                break;
            case NotifyCollectionChangedAction.Remove:
                break;
            case NotifyCollectionChangedAction.Replace:
                break;
            case NotifyCollectionChangedAction.Move:
                break;
            case NotifyCollectionChangedAction.Reset:
                break;
            default:
                throw new ArgumentOutOfRangeException();
        }
    }
}
11
Phil