C# 在嵌套的ObservableCollection(值的矩阵)中提升属性更改
嗨,我有一个绑定到DataGrid的对象矩阵: 在ViewMOdel中,矩阵本身被压缩到一个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中的值时,这些值不会立即在绑定集合中更新 在输入
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
},
});
}