Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在新窗口中使用列表双向绑定到Datagrid_C#_Wpf_Winforms_Data Binding_Datagrid - Fatal编程技术网

C# 在新窗口中使用列表双向绑定到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

我在将列表数据绑定到datagrid时遇到一些问题。我的代码如下

我想绑定我的可观察收藏

        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列表)
:基本(列表)
{
这