1

XAML は初めてです。ObservableCollection を MVVM のデータグリッドにバインドしようとしています。CollectionChanged の通知を受け取りたい。しかし、null 例外をスローします。

私が間違っているときは教えてください。前もって感謝します。

以下は、viewModel のコード ビハインドです。

public class MainwindowViewModel : INotifyPropertyChanged
{
    MyObject myObj;
    ObservableCollection<MyObject> _ocObj;

    public MainwindowViewModel()
    {
        _ocObj = new ObservableCollection<MyObject>();
        myObj = new MyObject();
        myObj.ID = 0;
        myObj.Name = "Name";
        _ocObj.Add(myObj);
        _ocObj.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(_ocMyobj_CollectionChanged);
    }

    void _ocMyobj_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        System.Windows.MessageBox.Show("propeties changed @ " + e.NewStartingIndex.ToString()
            + " old items starting @ " + e.OldStartingIndex + " olditems count " + e.OldItems.Count.ToString()
            + " action " + e.Action.ToString());
    }


    public ObservableCollection<MyObject> ocObj
    {
        get { return _ocObj; }
        set
        {
            PropertyChanged(this, new PropertyChangedEventArgs("ocMyobj"));
        } 
    }

    public string Name
    {
        get { return myObj.Name; }
        set
        {
            if (value !=null)
            {
                myObj.Name = value;
                PropertyChanged(this, new PropertyChangedEventArgs("Name"));
            }
        }
    }

    public int ID
    {
        get { return myObj.ID; }
        set
        {
            if (myObj.ID != value)
            {
                myObj.ID = value;
                PropertyChanged(this, new PropertyChangedEventArgs("ID"));
            }
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion
}

public class MyObject
{
    public string Name { get; set; }
    public int ID { get; set; }
}

以下は XAML です。

<Window.Resources>
    <vm:MainwindowViewModel x:Key="someObj"/>
</Window.Resources>
<DataGrid ItemsSource="{Binding ocObj}" DataContext="{Binding Source={StaticResource someObj}}" AutoGenerateColumns="True"  />
4

1 に答える 1

0

NotifyCollectionChangedEventArgs クラスのドキュメントを参照してください。OldItems オブジェクトは「Replace、Remove、または Move アクションの影響を受ける項目のリストを取得する」だけであることに注意してください。これが意味することは、他のアクションでは、OldItems が null になるということです。

したがって、ObservableCollection に対して Add アクションが実行されると、OldItems は null (かつ有効) になります。次のように、コードでチェックを実行するだけです。

            System.Windows.MessageBox.Show("propeties changed @ " + e.NewStartingIndex.ToString()
                + " old items starting @ " + e.OldStartingIndex + " olditems count " + 
                (e.OldItems == null ? "0" : e.OldItems.Count.ToString())
                + " action " + e.Action.ToString());
于 2013-02-14T21:56:47.207 に答える