C# Datagrid的动态/扩展条目

C# Datagrid的动态/扩展条目,c#,wpf,mvvm,datagrid,C#,Wpf,Mvvm,Datagrid,我试图创建一个datagrid,其中包含一个条目,该条目的属性来自json。问题是很多属性都应该基于json中的信息动态生成 我尝试的第一件事是用它们自己的getter和seter列出所有可能的属性。但这是一个很长的列表,感觉应该有一个自动化的解决方案来解决这个问题。这包含在Datagrid入口视图模型的末尾。因此,我能够在以下情况下绑定到数字: Number = obj.NUMBER; 之后,我研究了动态类型和扩展对象。我了解到,显然不可能将WPF绑定到ExpandooObject的扩展属性

我试图创建一个datagrid,其中包含一个条目,该条目的属性来自json。问题是很多属性都应该基于json中的信息动态生成

我尝试的第一件事是用它们自己的getter和seter列出所有可能的属性。但这是一个很长的列表,感觉应该有一个自动化的解决方案来解决这个问题。这包含在Datagrid入口视图模型的末尾。因此,我能够在以下情况下绑定到数字:

Number = obj.NUMBER;
之后,我研究了动态类型和扩展对象。我了解到,显然不可能将WPF绑定到ExpandooObject的扩展属性。所以我不能绑定到expando.Number

expando.Number = obj.NUMBER
我还试着仿效创建助手类来帮助绑定的例子,但我似乎无法让它工作。当我运行我的解决方案时,我得到一个错误,说属性“Numberz”不存在。所以我不能绑定到数字Z:

AddProperty("Numberz", typeof(string));
SetPropertyValue("Numberz", obj.NUMBER);
现在我没有主意了,所以如果这里有人能帮忙,我将非常感激。也许是最后几句话。我不是一个经验丰富的程序员,我正在尝试通过MVVM模式工作

数据网格入口视图模型

public class DatagridViewModel : MainViewModelBase
    {
        #region Singleton

        public static DatagridViewModel Instance = new DatagridViewModel();

        #endregion

        #region Fields

        private ObservableCollection<DatagridEntryViewModel> _coilEntries = new ObservableCollection<DatagridEntryViewModel>();
        private readonly IViewManager _viewManager;
        private readonly IDockManager _dockManager;

        #endregion

        #region Properties

        public ObservableCollection<DatagridEntryViewModel> CoilEntries
        {
            get { return _coilEntries; }
            set
            {
                _coilEntries = value;
                RaisePropertyChanged(() => CoilEntries);
            }
        }

        public ProductionExitCoilReport Report { get; set; }

        #endregion

        #region Constructor

        public DatagridViewModel()
        {
            _viewManager = Globals.Container.Resolve<IViewManager>();
            _dockManager = Globals.Container.Resolve<IDockManager>();


            getReport();

            foreach (var Coil in Report.Coils)
            {
                CoilEntries.Add(new DatagridEntryViewModel(Coil));
            }
        }

        #endregion

        #region Methods

        public void getReport()
        {
            var proxy = new Proxy<IReportService>();
            proxy.Open();
            var LijnId = new LijnIdentificatie { Department = "HDG", Firm = "LIE", LineNumber = "05" };
            var Periode = new Period { FromDate = new DateTime(2017 - 11 - 10), FromShift = 1, ToDate = new DateTime(2017 - 11 - 10), ToShift = 1 };
            var request = new ProductionReportRequest() { LijnIdentificatie = LijnId, Period = Periode };
            Report = proxy.Service.GetProductionExitCoilReport(request);


        }

        #endregion
    }
公共类DatagridEntryViewModel:ICustomTypeProvider,INotifyPropertyChanged { #区域字段

    /// <summary>
    /// Custom Type provider implementation - delegated through static methods.
    /// </summary>
    private readonly CustomTypeHelper<DatagridEntryViewModel> _helper = new CustomTypeHelper<DatagridEntryViewModel>();

    #endregion

    #region Constructor

    public DatagridEntryViewModel(ExitCoil model) 
    {
        _helper.PropertyChanged += (s, e) => PropertyChanged(this, e);

        dynamic Json = JObject.Parse(model.JsonCoilData);
        //CreationDatePost = Json.CREATION_DATE_S_POST;
        ////Number = Json.NUMBER;
        //CreationDatePost = Json.CREATION_DATE_S_POST;
        ////LeverageOrder = Json.LEVERAGE_ORDER;
        //Client = Json.CLIENT;
        //Skinned = Json.SKINNED;

        dynamic expando = new ExpandoObject();
        dynamic obj = JsonConvert.DeserializeObject<ExpandoObject>(Json.ToString());
        //AddProperty("Numberz", typeof(string));
        //SetPropertyValue("Numberz", obj.NUMBER);
        //expando.AddItem("Number");
        //expando[0] = obj.NUMBER;
        //Number = expando.Number;


        Model = model;

        //var settings = new JsonSerializerSettings();
        //settings.Converters.Add(new Models.DynamicJsonConverter());
        //var serializer = JsonSerializer.Create(settings);
        //JsonReader reader = new JsonTextReader(new StringReader(JsonString));

        //var Data = serializer.Deserialize<DynamicObject>(reader);
    }

    #endregion

    #region Model & proxy

    private ExitCoil _model;
    public ExitCoil Model
    {
        set { _model = value; }
    }

    #endregion

    #region Public Methods

    // Methods to support dynamic properties.
    public static void AddProperty(string name)
    {
        CustomTypeHelper<DatagridEntryViewModel>.AddProperty(name);
    }

    public static void AddProperty(string name, Type propertyType)
    {
        CustomTypeHelper<DatagridEntryViewModel>.AddProperty(name, propertyType);
    }

    public static void AddProperty(string name, Type propertyType, List<Attribute> attributes)
    {
        CustomTypeHelper<DatagridEntryViewModel>.AddProperty(name, propertyType, attributes);
    }

    public void SetPropertyValue(string propertyName, object value)
    {
        _helper.SetPropertyValue(propertyName, value);
    }

    public object GetPropertyValue(string propertyName)
    {
        return _helper.GetPropertyValue(propertyName);
    }

    public PropertyInfo[] GetProperties()
    {
        return _helper.GetProperties();
    }

    Type ICustomTypeProvider.GetCustomType()
    {
        return _helper.GetCustomType();
    }

    public event PropertyChangedEventHandler PropertyChanged = delegate { };
    private void RaisePropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    #endregion

    #region Properties

    //public string Number { get; private set; }

    //public string CreationDatePost { get; private set; }

    //public string LeverageOrder { get; private set; }

    public string Client { get; private set; }

    //public int OrderZnTop { get; private set; }

    //public int OrderZnBottom { get; private set; }

    //public string OrderAspect { get; private set; }

    //public string OderSideTrimming { get; private set; }

    //public string OrderPassivation { get; private set; }

    //public string OrderOilType { get; private set; }

    //public string OrderOilQuantity { get; private set; }


    #endregion

}
//
///自定义类型提供程序实现-通过静态方法委派。
/// 
私有只读CustomTypeHelper _helper=新CustomTypeHelper();
#端区
#区域构造函数
公共DatagridEntryViewModel(ExitCoil模型)
{
_helper.PropertyChanged+=(s,e)=>PropertyChanged(this,e);
动态Json=JObject.Parse(model.JsonCoilData);
//CreationDatePost=Json.CREATION\u DATE\u S\u POST;
////Number=Json.Number;
//CreationDatePost=Json.CREATION\u DATE\u S\u POST;
////LeverageOrder=Json.LEVERAGE\u顺序;
//Client=Json.Client;
//Skinned=Json.Skinned;
动态expando=新的ExpandoObject();
dynamic obj=JsonConvert.DeserializeObject(Json.ToString());
//AddProperty(“Numberz”,typeof(string));
//SetPropertyValue(“Numberz”,对象编号);
//expando.AddItem(“编号”);
//expando[0]=对象编号;
//编号=扩展编号;
模型=模型;
//var settings=new JsonSerializerSettings();
//settings.converter.Add(new Models.DynamicJsonConverter());
//var serializer=JsonSerializer.Create(设置);
//JsonReader=newjsontextreader(newstringreader(JsonString));
//var Data=serializer.Deserialize(读取器);
}
#端区
#区域模型与代理
私有ExitCoil模型;
公共出口公司模型
{
设置{u model=value;}
}
#端区
#区域公共方法
//方法来支持动态属性。
公共静态void AddProperty(字符串名称)
{
CustomTypeHelper.AddProperty(名称);
}
公共静态void AddProperty(字符串名称,类型propertyType)
{
CustomTypeHelper.AddProperty(名称,propertyType);
}
公共静态void AddProperty(字符串名称、类型propertyType、列表属性)
{
AddProperty(名称、属性类型、属性);
}
public void SetPropertyValue(字符串propertyName,对象值)
{
_SetPropertyValue(propertyName,value);
}
公共对象GetPropertyValue(字符串propertyName)
{
返回_helper.GetPropertyValue(propertyName);
}
公共属性信息[]获取属性()
{
返回_helper.GetProperties();
}
类型ICustomTypeProvider.GetCustomType()
{
返回_helper.GetCustomType();
}
公共事件PropertyChangedEventHandler PropertyChanged=委托{};
私有void RaisePropertyChanged([CallerMemberName]字符串propertyName=”“)
{
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
#端区
#区域属性
//公共字符串编号{get;private set;}
//公共字符串CreationDatePost{get;private set;}
//公共字符串标识符{get;private set;}
公共字符串客户端{get;private set;}
//public int OrderZnTop{get;private set;}
//public int-orderznboth{get;private set;}
//公共字符串OrderAspect{get;private set;}
//公共字符串ODERSIDETRIMING{get;private set;}
//公共字符串顺序钝化{get;private set;}
//公共字符串OrderOilType{get;private set;}
//公共字符串OrderOilQuantity{get;private set;}
#端区
}
数据网格视图模型

public class DatagridViewModel : MainViewModelBase
    {
        #region Singleton

        public static DatagridViewModel Instance = new DatagridViewModel();

        #endregion

        #region Fields

        private ObservableCollection<DatagridEntryViewModel> _coilEntries = new ObservableCollection<DatagridEntryViewModel>();
        private readonly IViewManager _viewManager;
        private readonly IDockManager _dockManager;

        #endregion

        #region Properties

        public ObservableCollection<DatagridEntryViewModel> CoilEntries
        {
            get { return _coilEntries; }
            set
            {
                _coilEntries = value;
                RaisePropertyChanged(() => CoilEntries);
            }
        }

        public ProductionExitCoilReport Report { get; set; }

        #endregion

        #region Constructor

        public DatagridViewModel()
        {
            _viewManager = Globals.Container.Resolve<IViewManager>();
            _dockManager = Globals.Container.Resolve<IDockManager>();


            getReport();

            foreach (var Coil in Report.Coils)
            {
                CoilEntries.Add(new DatagridEntryViewModel(Coil));
            }
        }

        #endregion

        #region Methods

        public void getReport()
        {
            var proxy = new Proxy<IReportService>();
            proxy.Open();
            var LijnId = new LijnIdentificatie { Department = "HDG", Firm = "LIE", LineNumber = "05" };
            var Periode = new Period { FromDate = new DateTime(2017 - 11 - 10), FromShift = 1, ToDate = new DateTime(2017 - 11 - 10), ToShift = 1 };
            var request = new ProductionReportRequest() { LijnIdentificatie = LijnId, Period = Periode };
            Report = proxy.Service.GetProductionExitCoilReport(request);


        }

        #endregion
    }
公共类DatagridViewModel:MainViewModelBase
{
#区域单态
公共静态DatagridViewModel实例=新DatagridViewModel();
#端区
#区域字段
私有ObservableCollection_coilEntries=新ObservableCollection();
专用只读IViewManager_viewManager;
私有只读IDockManager_dockManager;
#端区
#区域属性
公共可观测收集线圈
{
获取{return\u coilEntries;}
设置
{
_线圈=值;
RaisePropertyChanged(()=>线圈);
}
}
public ProductionExitCoilReport报告{get;set;}
#端区
#区域构造函数
公共DatagridViewModel()
{
_viewManager=Globals.Container.Resolve();
_dockManager=Globals.Container.Resolve();
getReport();
foreach(报告中的var线圈。线圈)
{
添加(新的DatagridEntryViewModel(Coil));
}
}
#端区
#区域方法
公共报告()
{