Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.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# MVVM中的数据网格绑定和编辑_C#_Wpf_Xaml_Mvvm - Fatal编程技术网

C# MVVM中的数据网格绑定和编辑

C# MVVM中的数据网格绑定和编辑,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,在多年使用代码落后之后,我刚刚尝试开始使用MVVM。我试图在百分比完成更改时更新此ClaimValue。此ClaimValue旨在显示基于完成百分比的合同金额百分比。当人们输入值时,或者当他们离开单元格时。我正试图用零代码隐藏来实现这一点,所以没有内置事件 我首先使用EF数据库进行描述、ContractAmt和BillCurrentAmt。PercentageComplete和ThisClaimValue作为EF创建的类的部分类位于单独的解决方案中 视图: 视图模型: public cl

在多年使用代码落后之后,我刚刚尝试开始使用MVVM。我试图在百分比完成更改时更新此ClaimValue。此ClaimValue旨在显示基于完成百分比的合同金额百分比。当人们输入值时,或者当他们离开单元格时。我正试图用零代码隐藏来实现这一点,所以没有内置事件

我首先使用EF数据库进行描述、ContractAmt和BillCurrentAmt。PercentageComplete和ThisClaimValue作为EF创建的类的部分类位于单独的解决方案中

视图:


视图模型:

  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; }