C# MVVM中的数据网格绑定和编辑
在多年使用代码落后之后,我刚刚尝试开始使用MVVM。我试图在百分比完成更改时更新此ClaimValue。此ClaimValue旨在显示基于完成百分比的合同金额百分比。当人们输入值时,或者当他们离开单元格时。我正试图用零代码隐藏来实现这一点,所以没有内置事件 我首先使用EF数据库进行描述、ContractAmt和BillCurrentAmt。PercentageComplete和ThisClaimValue作为EF创建的类的部分类位于单独的解决方案中 视图:C# MVVM中的数据网格绑定和编辑,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,在多年使用代码落后之后,我刚刚尝试开始使用MVVM。我试图在百分比完成更改时更新此ClaimValue。此ClaimValue旨在显示基于完成百分比的合同金额百分比。当人们输入值时,或者当他们离开单元格时。我正试图用零代码隐藏来实现这一点,所以没有内置事件 我首先使用EF数据库进行描述、ContractAmt和BillCurrentAmt。PercentageComplete和ThisClaimValue作为EF创建的类的部分类位于单独的解决方案中 视图: 视图模型: public cl
视图模型:
public class JBProgressBillItemsViewModel : INotifyPropertyChanged, IPageViewModel
{
public AcceptCommand AcceptEvent { get; set; }
public BackCommand BackEvent { get; set; }
public string Name => "JBProgressBillItems";
public JBProgressBillItemsViewModel()
{
HQCOList = Facade.GetVistaHQCO();
AcceptEvent = new AcceptCommand(this);
BackEvent = new BackCommand(this);
}
private bHQCO _hqco;
private bJCCM _jccm;
private bJCCI _jcciSection;
private bJCCI _jcci;
public ObservableCollection<bHQCO> HQCOList { get; }
public ObservableCollection<bJCCM> JCCMList { get; private set; }
public ObservableCollection<bJCCI> JCCISectionList { get; private set; }
public ObservableCollection<bJCCI> JCCIList { get; private set; }
public ObservableCollection<bJCCI> JCCISelectedList { get; private set; }
public bHQCO HQCO
{
get { return _hqco; }
set
{
_hqco = value;
JCCMList = Facade.GetVistaActiveProjects(_hqco.HQCo);
RaisePropertyChanged(nameof(HQCO));
RaisePropertyChanged(nameof(JCCMList));
}
}
public bJCCM JCCM
{
get { return _jccm; }
set
{
_jccm = value;
JCCIList = Facade.GetVistaContractItems(_hqco.HQCo, _jccm.Contract);
JCCISectionList =
new ObservableCollection<bJCCI>(JCCIList.Where(x => x.SICode == "H" || x.SICode == "SH"));
RaisePropertyChanged(nameof(JCCM));
RaisePropertyChanged(nameof(JCCISectionList));
}
}
public bJCCI JCCISection
{
get { return _jcciSection; }
set
{
_jcciSection = value;
try
{
JCCISelectedList = new ObservableCollection<bJCCI>(JCCIList.Where(x => _jcciSection.BillGroup == x.BillGroup && string.IsNullOrWhiteSpace(x.SICode)));
}
catch (ArgumentNullException)
{
}
RaisePropertyChanged(nameof(JCCISection));
RaisePropertyChanged(nameof(JCCISelectedList));
}
}
public bJCCI JCCI
{
get { return _jcci; }
set
{
_jcci = value;
_jcci.ThisClaimValue = value.PercentageComplete * value.ContractAmt / 100;
RaisePropertyChanged(nameof(JCCI));
RaisePropertyChanged(nameof(JCCISelectedList));
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public string Error => null;
}
公共类JBProgressBillItemsViewModel:INotifyPropertyChanged,IPageViewModel
{
公共接受命令接受事件{get;set;}
public BackCommand BackEvent{get;set;}
公共字符串名称=>“JBProgressBillItems”;
公共jbprogressbillitesviewmodel()
{
HQCOList=Facade.GetVistaHQCO();
AcceptEvent=新的AcceptCommand(此);
BackEvent=新的BackCommand(此命令);
}
私人bHQCO_hqco;
私人bJCCM;
私人bJCCI;
私人bJCCI;
公共可观测收集HQCOList{get;}
公共ObservableCollection JCCMList{get;private set;}
public observeCollection jccessionList{get;private set;}
公共ObservableCollection JCCIList{get;private set;}
public observeCollection JCCISelectedList{get;private set;}
公共bHQCO HQCO
{
获取{return\u hqco;}
设置
{
_hqco=数值;
JCCMList=Facade.GetVistaActiveProjects(_hqco.hqco);
RaiseProperty变更(HQCO名称);
RaisePropertyChanged(名称(JCCMList));
}
}
公共bJCCM
{
获取{return\u jccm;}
设置
{
_jccm=值;
JCCIList=Facade.getvistacontractions(_hqco.hqco,_jccm.Contract);
JCictionList=
新的可观察集合(JCCIList.Where(x=>x.SICode==“H”| | x.SICode==“SH”);
RaisePropertyChanged(名称(JCCM));
RaisePropertyChanged(名称(jccessionList));
}
}
公共部门
{
获取{return\u jccession;}
设置
{
_jcciSection=值;
尝试
{
JCCISelectedList=newobserveCollection(JCCIList.Where(x=>jcciSection.BillGroup==x.BillGroup&&string.IsNullOrWhiteSpace(x.SICode));
}
捕获(异常)
{
}
RaisePropertyChanged(名称(JCCISection));
RaisePropertyChanged(名称(JCCISelectedList));
}
}
公共bJCCI
{
获取{return_jcci;}
设置
{
_jcci=价值;
_jcci.ThisClaimValue=value.PercentageComplete*value.ContractAmt/100;
RaisePropertyChanged(名称(JCCI));
RaisePropertyChanged(名称(JCCISelectedList));
}
}
公共事件属性更改事件处理程序属性更改;
私有void RaisePropertyChanged(字符串propertyName)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
}
公共字符串错误=>null;
}
编辑:在上面添加了全视图模型代码。要使其工作,请确保将
jccesselectedlist
指定为observedcollection
,这将解决您的问题。否则,您需要为每个事件引发属性更改事件
说明
合同金额
每个元素单独作为raiseproperty changed事件不会为元素更改生成任何事件,因为当元素更改其正在更改的数据上下文时,
jccesselectedList
的属性保持不变。要使其工作,请确保将jccesselectedList
指定为解决您的问题。否则,您需要为每个事件引发属性更改事件
说明
合同金额
每个元素单独作为raiseproperty changed事件不会为元素更改生成任何事件,因为当元素更改其数据上下文时,
JCCISelectedList
的属性保持不变。因此bJCCI是EF中的一个表,您希望在百分比完成更改时更新此ClaimValue,其中ThisClaimValue和PercentageComplete是此表中的一个字段。在这里,您为表对象调用RaisePropertyChanged,而不是为特定字段值(如ThisClaimValue或PercentageComplete)调用collection changed
因此,解决方案是创建一个模型类,用模型类属性包装表字段,如下所示
public class Model
{
private bJCCI _jcci;
public Double PerComplete
{
get { return _jcci.PercentageComplete ; }
set
{
_jcci.PercentageComplete = value;
RaisePropertyChanged(nameof(PerComplete));
RaisePropertyChanged(nameof(ClaimValue )); //Model property of ThisThisClaimValue field
}
}
}
现在,当PerComplete属性发生更改时,ClaimValue属性将被更新并通知。
在Xaml中绑定这些模型的属性,不要直接使用EF模型类
也在ViewModel中创建
public ObservableCollection<Model> MyCollection { get; set; }
publicobservablecollection MyCollection{get;set;}
并将其与DataGrid项源绑定
请参考此链接;
希望这会给出一个想法:)因此BJCI是EF中的一个表,您希望在PercentageComplete发生更改时更新ThisClaimValue,其中ThisClaimValue和PercentageComplete是该表中的一个字段。这里,您正在为表对象调用RaisePropertyChanged,而不是为特定字段值(如ThisClaimValue或PercentageComplete)调用集合更改。
public ObservableCollection<Model> MyCollection { get; set; }