2013-02-14 67 views
1

Im新到XAML,我試圖將ObservableCollection綁定到MVVM中的datagrid。 我想在CollectionChanged時收到通知。但它拋出空例外。將ObservableCollection綁定到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將爲空。

因此,如果對您的ObservableCollection執行Add操作,則OldItems爲空(且有效)。只需在您的代碼中進行檢查,例如:

  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()); 
相關問題