C# 在新窗口中使用列表双向绑定到Datagrid
我在将列表数据绑定到datagrid时遇到一些问题。我的代码如下 我想绑定我的可观察收藏C# 在新窗口中使用列表双向绑定到Datagrid,c#,wpf,winforms,data-binding,datagrid,C#,Wpf,Winforms,Data Binding,Datagrid,我在将列表数据绑定到datagrid时遇到一些问题。我的代码如下 我想绑定我的可观察收藏 ObservableCollection<RectangleContour> rectContourList = new ObservableCollection<RectangleContour>(); 我想将列表绑定到另一个窗口中的datagrid视图,该窗口是从上述对象所属的窗口调用的,我这样调用新窗口 Window windo
ObservableCollection<RectangleContour> rectContourList = new ObservableCollection<RectangleContour>();
我想将列表绑定到另一个窗口中的datagrid视图,该窗口是从上述对象所属的窗口调用的,我这样调用新窗口
Window window = new Window
{
Title = "My User Control Dialog",
Content = new UserControl1(list1: rectContourList),
};
window.ShowDialog();
window.Close();
数据显示正确,如果我编辑一个已经存在于网格上的元组,更改将反映在我的主窗口中,就像我希望的那样,但是我也希望能够通过datagrid添加新对象,当我尝试这样做时,我在窗口上得到一个异常。close()这样说,我需要路径或xPath进行双向绑定
有人能告诉我为什么会这样吗?我是否需要在两个窗口之间以及datagrid和observable集合之间设置数据绑定
感谢您的帮助。在您的情况下,使用此类而不是简单的列表可能会有所帮助:
public class ObservableListSource<T> : ObservableCollection<T>, IListSource
where T : class
{
private IBindingList _bindingList;
bool IListSource.ContainsListCollection { get { return false; } }
IList IListSource.GetList()
{
return _bindingList ?? (_bindingList = this.ToBindingList());
}
}
公共类ObservableListSource:ObservableCollection,IListSource
T:在哪里上课
{
私有IBindingList _bindingList;
bool IListSource.ContainsListCollection{get{return false;}
IList IListSource.GetList()
{
返回_bindingList??(_bindingList=this.ToBindingList());
}
}
编辑:
如果您想跟踪模型的更改,例如在断开连接模式下,以下类非常方便:
public class EditableList<TModel> : ObservableList<TModel>
where TModel : class, INotifyPropertyChanged
{
#region Properties
public List<TModel> EditedItems { get; set; }
public List<TModel> AddedItems { get; set; }
public List<TModel> DeletedItems { get; set; }
public Boolean HasChanged
{
get
{
return
(
this.EditedItems.Count > 0 ||
this.AddedItems.Count > 0 ||
this.DeletedItems.Count > 0
);
}
}
#endregion
#region Constructor
public EditableList(IList<TModel> list)
: base(list)
{
this.AddedItems = new List<TModel>();
this.EditedItems = new List<TModel>();
this.DeletedItems = new List<TModel>();
this.CollectionChanged += EditableList_CollectionChanged;
foreach (var item in list)
item.PropertyChanged += TModelEditableList_PropertyChanged;
}
public EditableList() : this(new List<TModel>()) { }
#endregion
#region Events
void TModelEditableList_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (!(sender is TModel))
return;
var entity = (TModel)sender;
this.AddToEditedItems(entity);
}
void EditableList_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
foreach (TModel entity in e.NewItems)
{
this.AddToAddedItems(entity);
}
else if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
foreach (TModel entity in e.OldItems)
{
this.AddToDeletedItems(entity);
}
}
#endregion
#region Methods
public void AddToEditedItems(TModel entity)
{
if (!this.EditedItems.Contains(entity) && !this.AddedItems.Contains(entity))
this.EditedItems.Add(entity);
}
public void AddToAddedItems(TModel entity)
{
this.AddedItems.Add(entity);
entity.PropertyChanged += TModelEditableList_PropertyChanged;
}
public void AddToDeletedItems(TModel entity)
{
if (this.EditedItems.Contains(entity))
{
this.EditedItems.Remove(entity);
this.DeletedItems.Add(entity);
}
else if (this.AddedItems.Contains(entity))
this.AddedItems.Remove(entity);
else
this.DeletedItems.Add(entity);
}
public void ClearEditHistory()
{
this.EditedItems.Clear();
this.AddedItems.Clear();
this.DeletedItems.Clear();
}
#endregion
}
公共类EditableList:ObservableList
其中TModel:class,INotifyPropertyChanged
{
#区域属性
公共列表编辑器{get;set;}
公共列表加法器{get;set;}
公共列表删除数据项{get;set;}
公共布尔值已更改
{
得到
{
返回
(
this.editems.Count>0||
this.AddedItems.Count>0||
this.DeletedItems.Count>0
);
}
}
#端区
#区域构造函数
公共可编辑列表(IList列表)
:基本(列表)
{
this.AddedItems=新列表();
this.editems=新列表();
this.DeletedItems=新列表();
this.CollectionChanged+=可编辑列表\u CollectionChanged;
foreach(列表中的变量项)
item.PropertyChanged+=TModelEditableList\u PropertyChanged;
}
public EditableList():此(新列表()){}
#端区
#地区活动
void TModelEditableList_PropertyChanged(对象发送方,System.ComponentModel.PropertyChangedEventArgs e)
{
如果(!(发送方为TModel))
返回;
var实体=(TModel)发送方;
本文件为AddToEdItems(实体);
}
作废可编辑列表\u CollectionChanged(对象发送方,System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if(e.Action==System.Collections.Specialized.NotifyCollectionChangedAction.Add)
foreach(e.NewItems中的TModel实体)
{
此.addToAddItems(实体);
}
else if(e.Action==System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
foreach(e.OldItems中的TModel实体)
{
此.AddToDeletedItems(实体);
}
}
#端区
#区域方法
公共void addToEdItems(TModel实体)
{
如果(!this.editems.Contains(实体)&&!this.AddedItems.Contains(实体))
this.editems.Add(实体);
}
公共void addToAddItems(TModel实体)
{
本.增补.增补(实体);
entity.PropertyChanged+=TModelEditableList\u PropertyChanged;
}
公共void AddToDeletedItems(TModel实体)
{
if(this.editems.Contains(实体))
{
this.editems.Remove(实体);
this.DeletedItems.Add(实体);
}
else if(this.AddedItems.Contains(实体))
本.增补.删除(实体);
其他的
this.DeletedItems.Add(实体);
}
public void ClearEditHistory()
{
this.editems.Clear();
this.additems.Clear();
this.DeletedItems.Clear();
}
#端区
}
我希望这会有所帮助。在您的情况下,使用此类而不是简单的列表可能会有所帮助:
public class ObservableListSource<T> : ObservableCollection<T>, IListSource
where T : class
{
private IBindingList _bindingList;
bool IListSource.ContainsListCollection { get { return false; } }
IList IListSource.GetList()
{
return _bindingList ?? (_bindingList = this.ToBindingList());
}
}
公共类ObservableListSource:ObservableCollection,IListSource
T:在哪里上课
{
私有IBindingList _bindingList;
bool IListSource.ContainsListCollection{get{return false;}
IList IListSource.GetList()
{
返回_bindingList??(_bindingList=this.ToBindingList());
}
}
编辑:
如果您想跟踪模型的更改,例如在断开连接模式下,以下类非常方便:
public class EditableList<TModel> : ObservableList<TModel>
where TModel : class, INotifyPropertyChanged
{
#region Properties
public List<TModel> EditedItems { get; set; }
public List<TModel> AddedItems { get; set; }
public List<TModel> DeletedItems { get; set; }
public Boolean HasChanged
{
get
{
return
(
this.EditedItems.Count > 0 ||
this.AddedItems.Count > 0 ||
this.DeletedItems.Count > 0
);
}
}
#endregion
#region Constructor
public EditableList(IList<TModel> list)
: base(list)
{
this.AddedItems = new List<TModel>();
this.EditedItems = new List<TModel>();
this.DeletedItems = new List<TModel>();
this.CollectionChanged += EditableList_CollectionChanged;
foreach (var item in list)
item.PropertyChanged += TModelEditableList_PropertyChanged;
}
public EditableList() : this(new List<TModel>()) { }
#endregion
#region Events
void TModelEditableList_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (!(sender is TModel))
return;
var entity = (TModel)sender;
this.AddToEditedItems(entity);
}
void EditableList_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
foreach (TModel entity in e.NewItems)
{
this.AddToAddedItems(entity);
}
else if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
foreach (TModel entity in e.OldItems)
{
this.AddToDeletedItems(entity);
}
}
#endregion
#region Methods
public void AddToEditedItems(TModel entity)
{
if (!this.EditedItems.Contains(entity) && !this.AddedItems.Contains(entity))
this.EditedItems.Add(entity);
}
public void AddToAddedItems(TModel entity)
{
this.AddedItems.Add(entity);
entity.PropertyChanged += TModelEditableList_PropertyChanged;
}
public void AddToDeletedItems(TModel entity)
{
if (this.EditedItems.Contains(entity))
{
this.EditedItems.Remove(entity);
this.DeletedItems.Add(entity);
}
else if (this.AddedItems.Contains(entity))
this.AddedItems.Remove(entity);
else
this.DeletedItems.Add(entity);
}
public void ClearEditHistory()
{
this.EditedItems.Clear();
this.AddedItems.Clear();
this.DeletedItems.Clear();
}
#endregion
}
公共类EditableList:ObservableList
其中TModel:class,INotifyPropertyChanged
{
#区域属性
公共列表编辑器{get;set;}
公共列表加法器{get;set;}
公共列表删除数据项{get;set;}
公共布尔值已更改
{
得到
{
返回
(
this.editems.Count>0||
this.AddedItems.Count>0||
this.DeletedItems.Count>0
);
}
}
#端区
#区域构造函数
公共可编辑列表(IList列表)
:基本(列表)
{
这