在MVVM中将ObservableCollection绑定到datagrid
我是XAML新手,我正在尝试将ObservableCollection绑定到MVVM中的datagrid。 我想在收藏更改时得到通知。但它抛出空异常 当我出错时请告诉我。提前谢谢 以下是viewModel的隐藏代码:在MVVM中将ObservableCollection绑定到datagrid,mvvm,binding,datagrid,observablecollection,Mvvm,Binding,Datagrid,Observablecollection,我是XAML新手,我正在尝试将ObservableCollection绑定到MVVM中的datagrid。 我想在收藏更改时得到通知。但它抛出空异常 当我出错时请告诉我。提前谢谢 以下是viewModel的隐藏代码: public class MainwindowViewModel : INotifyPropertyChanged { MyObject myObj; ObservableCollection<MyObject> _ocObj; public
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; }
}
public类MainwindowViewModel:INotifyPropertyChanged
{
肌体肌体;
可观测收集;
公共主窗口视图模型()
{
_ocObj=新的ObservableCollection();
myObj=新的MyObject();
myObj.ID=0;
myObj.Name=“Name”;
_ocObj.Add(myObj);
_ocObj.CollectionChanged+=新系统.Collections.Specialized.NotifyCollectionChangedEventHandler(\u ocMyobj\u CollectionChanged);
}
void _ocMyobj_CollectionChanged(对象发送方,System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
System.Windows.MessageBox.Show(“属性已更改@”+e.NewStartingIndex.ToString()
+“旧项目开始@”+e.OldStartingIndex+“旧项目计数”+e.olditems.count.ToString()
+“action”+e.action.ToString());
}
公共可观测收集ocObj
{
获取{return\u ocObj;}
设置
{
房地产变更(即新的房地产变更项目(“ocMyobj”);
}
}
公共字符串名
{
获取{return myObj.Name;}
设置
{
if(值!=null)
{
myObj.Name=值;
PropertyChanged(即新PropertyChangedEventArgs(“名称”);
}
}
}
公共整数ID
{
获取{return myObj.ID;}
设置
{
if(myObj.ID!=值)
{
myObj.ID=值;
PropertyChanged(即新PropertyChangedEventArgs(“ID”);
}
}
}
#区域INotifyProperty更改成员
公共事件属性更改事件处理程序属性更改;
#端区
}
公共类MyObject
{
公共字符串名称{get;set;}
公共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" />
请查看上的文档。请注意,OldItems对象仅“获取受替换、删除或移动操作影响的项目列表”。这意味着对于其他操作,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());