Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.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/13.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# 在嵌套的ObservableCollection(值的矩阵)中提升属性更改_C#_Wpf_Datagrid_Catel - Fatal编程技术网

C# 在嵌套的ObservableCollection(值的矩阵)中提升属性更改

C# 在嵌套的ObservableCollection(值的矩阵)中提升属性更改,c#,wpf,datagrid,catel,C#,Wpf,Datagrid,Catel,嗨,我有一个绑定到DataGrid的对象矩阵: 在ViewMOdel中,矩阵本身被压缩到一个ObservableCollection中: public ObservableCollection<ObservableCollection<object>> MyMatrix {get; set;} publicobservablecollection MyMatrix{get;set;} 我的问题是,当我更改Datagrid中的值时,这些值不会立即在绑定集合中更新 在输入

嗨,我有一个绑定到DataGrid的对象矩阵:

在ViewMOdel中,矩阵本身被压缩到一个ObservableCollection中:

public ObservableCollection<ObservableCollection<object>> MyMatrix {get; set;}
publicobservablecollection MyMatrix{get;set;}
我的问题是,当我更改Datagrid中的值时,这些值不会立即在绑定集合中更新

在输入一个单元格后,如何使datagrid立即更新其数据源

这是我的密码:

XAML:


视图模型:

using Catel.MVVM;
using System;
using Catel.Data;
using TestMatrix.Models;
using System.Collections.ObjectModel;
using System.Windows.Controls;
using System.Windows.Data;
using System.Collections.Generic;


namespace TestMatrix.ViewModels
{
    /// <summary>
    /// name view model.
    /// </summary>
    public class MainWindowViewModel : ViewModelBase
    {
        #region Properties
        /// <summary>
        /// Gets or sets the property value.
        /// </summary>
        public ObservableCollection<DataGridColumn> OnlineMarketerMixColumns
        {
            get { return GetValue<ObservableCollection<DataGridColumn>>(OnlineMarketerMixColumnsProperty); }
            set { SetValue(OnlineMarketerMixColumnsProperty, value); }
        }

        /// <summary>
        /// Register the OnlineMarketerMixColumns property so it is known in the class.
        /// </summary>
        public static readonly PropertyData OnlineMarketerMixColumnsProperty = RegisterProperty("OnlineMarketerMixColumns", typeof(ObservableCollection<DataGridColumn>), null);

        /// <summary>
        /// Gets or sets the property value.
        /// </summary>
        public ExtractedOnlineData Data
        {
            get { return GetValue<ExtractedOnlineData>(DataProperty); }
            set { SetValue(DataProperty, value); }
        }

        /// <summary>
        /// Register the Data property so it is known in the class.
        /// </summary>
        public static readonly PropertyData DataProperty = RegisterProperty("Data", typeof(ExtractedOnlineData), null);

        #endregion

        #region Constructors
        /// <summary>
        /// Initializes a new instance of the <see cref="MainWindowViewModel"/> class.
        /// </summary>
        public MainWindowViewModel()
        {

            Data = new ExtractedOnlineData();

            ObservableCollection<ObservableCollection<object>> aMatrix = new ObservableCollection<ObservableCollection<object>>();
            ObservableCollection<object> innerMatrix = new ObservableCollection<object>() { 1, 2, 3, 4 };
            aMatrix.Add(innerMatrix);
            Data.MarketerMixMatrix = aMatrix;

            OnlineMarketerMixColumns = new ObservableCollection<DataGridColumn>();

            for (int i = 0; i < 4; i++)
            {
                var column = new DataGridTextColumn();

                OnlineMarketerMixColumns.Add(
                    new DataGridTextColumn
                    {
                        Header = string.Format("ColumnNumber"+i),
                        Binding = new Binding(string.Format("[{0}]", i))
                    });
            }
        }}
使用Catel.MVVM;
使用制度;
使用类别数据;
使用TestMatrix.Models;
使用System.Collections.ObjectModel;
使用System.Windows.Controls;
使用System.Windows.Data;
使用System.Collections.Generic;
命名空间TestMatrix.ViewModels
{
/// 
///命名视图模型。
/// 
公共类MainWindowViewModel:ViewModelBase
{
#区域属性
/// 
///获取或设置属性值。
/// 
公共可观测联机收集列
{
获取{return GetValue(onlinemarketmixcolumnsproperty);}
set{SetValue(onlineColumnsProperty,value);}
}
/// 
///注册OnlineMixColumns属性,使其在类中已知。
/// 
公共静态只读属性Data OnlineMarketMixColumnsProperty=RegisterProperty(“OnlineMarketMixColumns”,typeof(ObservableCollection),null);
/// 
///获取或设置属性值。
/// 
公共提取的联机数据
{
获取{返回GetValue(DataProperty);}
set{SetValue(DataProperty,value);}
}
/// 
///注册数据属性,使其在类中已知。
/// 
公共静态只读属性Data DataProperty=RegisterProperty(“数据”,类型为(ExtractedOnlineData),null);
#端区
#区域构造函数
/// 
///初始化类的新实例。
/// 
公共主窗口视图模型()
{
数据=新提取的OnlineData();
ObservableCollection aMatrix=新的ObservableCollection();
ObservableCollection innerMatrix=新的ObservableCollection(){1,2,3,4};
aMatrix.Add(innerMatrix);
Data.MixMatrix=aMatrix;
OnlineMixColumns=新的ObservableCollection();
对于(int i=0;i<4;i++)
{
var column=新的DataGridTextColumn();
Online列。添加(
新DataGridTextColumn
{
Header=string.Format(“ColumnNumber”+i),
Binding=新绑定(string.Format(“[{0}]”,i))
});
}
}}
型号:

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Linq;
using System.Text;

namespace TestMatrix.Models
{
    public class ExtractedOnlineData : INotifyPropertyChanged
    {
        public ExtractedOnlineData()
        {
            this.ColumnNames = new List<string>();
            this.MarketerMixMatrix = new ObservableCollection<ObservableCollection<object>>();

        }

        private ObservableCollection<ObservableCollection<object>> marketerMixMatrix;

        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void RaisePropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        /// <summary>
        /// Spaltenname der eingelesene Datei.
        /// </summary>
        public List<string> ColumnNames { get; set; }


        /// <summary>
        /// Vermarkter-Matrix.
        /// </summary>
        public ObservableCollection<ObservableCollection<object>> MarketerMixMatrix
        {
            get { return marketerMixMatrix; }
            set { 
                marketerMixMatrix = value;
                RaisePropertyChanged("MarketerMixMatrix");
                }
        }

        /// <summary>
        /// 
        /// </summary>
        public string AString { get; set; }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Collections.ObjectModel;
使用System.Collections.Specialized;
使用系统组件模型;
使用System.Linq;
使用系统文本;
名称空间TestMatrix.Models
{
提取的公共类OnlineData:INotifyPropertyChanged
{
公共提取联机数据()
{
this.ColumnNames=新列表();
this.MixMatrix=新的ObservableCollection();
}
私有可观测集合矩阵;
公共事件属性更改事件处理程序属性更改;
受保护的虚拟void RaisePropertyChanged(字符串propertyName)
{
if(PropertyChanged!=null)
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
/// 
///爱因格勒森意大利面。
/// 
公共列表列名称{get;set;}
/// 
///Vermarkter矩阵。
/// 
公共可观测集合矩阵
{
获取{return matrix;}
集合{
矩阵=值;
RaisePropertyChanged(“市场营销混合矩阵”);
}
}
/// 
/// 
/// 
公共字符串AString{get;set;}
}
}

我看到您试图通过对数据网格的
项资源
使用
UpdateSourceTrigger=PropertyChanged
来解决您的问题。您想要的是单元格绑定源在单元格更改时进行更新,而不是
DataGrid

通过这种推理,很明显,在实例化
OnlineColumns
属性的
DataGridTextColumn
对象时,需要调整绑定:

for (int i = 0; i < 4; i++)
{
    OnlineMarketerMixColumns.Add(
        new DataGridTextColumn
        {
            Header = string.Format("ColumnNumber"+i),
            Binding = new Binding(string.Format("[{0}]", i))
            {
                UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
            },
        });
}
for(int i=0;i<4;i++)
{
Online列。添加(
新DataGridTextColumn
{
Header=string.Format(“ColumnNumber”+i),
Binding=新绑定(string.Format(“[{0}]”,i))
{
UpdateSourceTrigger=UpdateSourceTrigger.PropertyChanged
},
});
}

您需要绑定事件,以便在更改值时立即更新集合。您可以添加文本框的textchange event,以便修改集合。您是否可以缩小范围:
“只有在更改值后按return键时,集合才会更新”
?当您在
DataGrid
中编辑单元格时,它的值会在什么之后在基础集合中设置?在您完成编辑行之后?@Sinatr:嗨,我的意思是,如果我在单元格中写入内容,然后按RETURN键,那么集合将立即更新。@Farzi,您能给我举个例子吗?
for (int i = 0; i < 4; i++)
{
    OnlineMarketerMixColumns.Add(
        new DataGridTextColumn
        {
            Header = string.Format("ColumnNumber"+i),
            Binding = new Binding(string.Format("[{0}]", i))
            {
                UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
            },
        });
}