2013-02-14 4 views
1

Im новое для XAML, я пытаюсь связать ObservableCollection с datagrid в MVVM. Я хочу получать уведомления, когда CollectionChanged. Но его бросание нулевого исключения.Связывание ObservableCollection с datagrid в MVVM

Пожалуйста, дайте мне знать, когда я пойду не так. Заранее спасибо.

Ниже код позади для 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" /> 

ответ

0

Посмотрите на документацию по NotifyCollectionChangedEventArgs class. Обратите внимание, что объект OldItems только «Получает список элементов, на которые влияет действие« Заменить, удалить или переместить ». Это означает, что для других действий, OldItems будет null.

Следовательно, если действие Добавить выполняется против вашего ObservableCollection, 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()); 
Смежные вопросы