using BPASmartClient.Compiler; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Data; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Threading; namespace BPASmartClient.SCADAControl.CustomerControls { /// /// TheDataGrid.xaml 的交互逻辑 /// public partial class TheDataGrid :DataGrid, IExecutable, IDisposable { public TheDataGrid() { InitializeComponent(); Width = 100; Height = 100; this.Loaded += TheDataGrid_Loaded; ; } private void TheDataGrid_Loaded(object sender, RoutedEventArgs e) { TabItems.CollectionChanged += TabItems_CollectionChanged; } private void TabItems_CollectionChanged(object? sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { if (TabItems.Count > 0) { try { TabItemsStr = JsonConvert.SerializeObject(TabItems); GenerateDataRefresh(); } catch (Exception ex) { } } } public string ControlType => "控件"; private bool isExecuteState; public bool IsExecuteState { get { return isExecuteState; } set { isExecuteState = value; if (IsExecuteState) { //Style = null; Register(); } } } DispatcherTimer timer = new DispatcherTimer(); /// /// 注册需要处理的事件 /// public void Register() { if (!string.IsNullOrEmpty(TabItemsStr)) { try { TabItems = JsonConvert.DeserializeObject>(TabItemsStr); } catch (Exception ex) { } } Style = null; if (DataSouceType == DataTypeEnum.API接口) { timer.Interval = TimeSpan.FromMilliseconds(TimeCount); timer.Tick += Timer_Tick; ; timer.Start(); } } public void Dispose() { timer.Stop(); FDataSouce = ""; if (IsRun) IsRun = false; GenerateDataRefresh(); } private void Timer_Tick(object? sender,EventArgs e) { if (!string.IsNullOrEmpty(DataSouceInformation)) { if (DataSouceType == DataTypeEnum.API接口) { if (Class_DataBus.GetInstance().Dic_APIData.ContainsKey(DataSouceInformation)) { FDataSouce = Class_DataBus.GetInstance().Dic_APIData[DataSouceInformation];// = GenerateData; } } else if (DataSouceType == DataTypeEnum.Redis) { if (DataSouceInformation.Contains(".") && DataSouceInformation.Contains("{Binding ")) { string[] str = DataSouceInformation.Replace("{Binding ", "").Replace("}", "").Split("."); if (str.Length > 1) { if (Class_DataBus.GetInstance().Dic_RedisData.ContainsKey(str[0])) { Dictionary b = Class_DataBus.GetInstance().Dic_RedisData[str[0]]; if (b != null && b.ContainsKey(str[1])) FDataSouce = b[str[1]].ToString(); } } } } else if (DataSouceType == DataTypeEnum.静态数据) { FDataSouce = ""; } } } #region 数据绑定模块 [Category("名称[自动生成]")] private string TabItemsStr { get { return (string)GetValue(TabItemsStrProperty); } set { SetValue(TabItemsStrProperty, value); } } private static readonly DependencyProperty TabItemsStrProperty = DependencyProperty.Register("TabItemsStr", typeof(string), typeof(TheDataGrid), new PropertyMetadata(string.Empty)); [Category("集合")] public ObservableCollection<列显示设置> TabItems { get { return (ObservableCollection<列显示设置>)GetValue(TabItemsProperty); } set { SetValue(TabItemsProperty, value); } } private static readonly DependencyProperty TabItemsProperty = DependencyProperty.Register("TabItems", typeof(ObservableCollection<列显示设置>), typeof(TheDataGrid), new PropertyMetadata(new ObservableCollection<列显示设置>())); public event EventHandler PropertyChange; //声明一个事件 [Category("数据绑定-数据来源")] public DataTypeEnum DataSouceType { get { return (DataTypeEnum)GetValue(DataSouceTypeProperty); } set { SetValue(DataSouceTypeProperty,value); } } public static readonly DependencyProperty DataSouceTypeProperty = DependencyProperty.Register("DataSouceType",typeof(DataTypeEnum),typeof(TheDataGrid),new PropertyMetadata(DataTypeEnum.API接口)); [Category("数据绑定-数据来源")] public int TimeCount { get { return (int)GetValue(TimeCountProperty); } set { SetValue(TimeCountProperty,value); } } public static readonly DependencyProperty TimeCountProperty = DependencyProperty.Register("TimeCount",typeof(int),typeof(TheDataGrid),new PropertyMetadata(500)); [Category("数据绑定-数据来源")] public string DataSouceInformation { get { return (string)GetValue(DataSouceInformationProperty); } set { SetValue(DataSouceInformationProperty,value); } } public static readonly DependencyProperty DataSouceInformationProperty = DependencyProperty.Register("DataSouceInformation",typeof(string),typeof(TheDataGrid),new PropertyMetadata("api0")); [Category("数据绑定")] public string FDataSouce { get { return (string)GetValue(FDataSouceProperty); } set { SetValue(FDataSouceProperty,value); } } public static readonly DependencyProperty FDataSouceProperty = DependencyProperty.Register("FDataSouce",typeof(string),typeof(TheDataGrid),new PropertyMetadata(string.Empty,new PropertyChangedCallback(onFDataSouceChanged))); private static void onFDataSouceChanged(DependencyObject d,DependencyPropertyChangedEventArgs e) => (d as TheDataGrid)?.DataSouceRefresh(); public void DataSouceRefresh() { try { //if (!string.IsNullOrEmpty(FDataSouce)) { GenerateData = (string)CSharpConfig.GetInstance().RunCSharp(Code,new object[] { FDataSouce }); if (PropertyChange != null) { PropertyChange(this,null); } } } catch (Exception ex) { } } public static string _code = "public string main(string message) \n{ \n //请在此填写你的代码\n\n return message; \n}\n"; [Category("数据绑定")] public string Code { get { return (string)GetValue(CodeProperty); } set { SetValue(CodeProperty,value); } } public static readonly DependencyProperty CodeProperty = DependencyProperty.Register("Code",typeof(string),typeof(TheDataGrid),new PropertyMetadata(_code)); [Category("数据绑定")] public bool IsRun { get { return (bool)GetValue(RunProperty); } set { SetValue(RunProperty, value); } } public static readonly DependencyProperty RunProperty = DependencyProperty.Register("IsRun", typeof(bool), typeof(TheDataGrid), new PropertyMetadata(false, new PropertyChangedCallback(onIsRunChanged))); private static void onIsRunChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) => (d as TheDataGrid)?.IsRunRefresh(); public void IsRunRefresh() { //测试运行 if (IsRun) IsExecuteState = true; else { IsExecuteState = false; Dispose(); } } [Category("数据绑定")] public string GenerateData { get { return (string)GetValue(GenerateDataProperty); } set { SetValue(GenerateDataProperty,value); } } public static readonly DependencyProperty GenerateDataProperty = DependencyProperty.Register("GenerateData",typeof(string),typeof(TheDataGrid),new PropertyMetadata(string.Empty,new PropertyChangedCallback(onGenerateDataChanged))); private static void onGenerateDataChanged(DependencyObject d,DependencyPropertyChangedEventArgs e) => (d as TheDataGrid)?.GenerateDataRefresh(); public void GenerateDataRefresh() { if (!string.IsNullOrEmpty(GenerateData) && GenerateData.Contains("data")) { try { Dictionary keys = JsonConvert.DeserializeObject>(GenerateData); List> obj2 = JsonConvert.DeserializeObject>>(keys["data"].ToString()); //ItemsString = JsonConvert.DeserializeObject(GenerateData); // 运行时进行项目绑定 //this.AutoGenerateColumns = false; this.CanUserAddRows = false; this.CanUserDeleteRows = false; this.RowHeaderWidth = 0; this.GridLinesVisibility = DataGridGridLinesVisibility.None; this.BorderThickness = new Thickness(0); this.ItemsSource = ListToDataTable(obj2).DefaultView; } catch (Exception ex) { } } else { // this.ItemsSource = new DataTable().DefaultView; } } public DataTable ListToDataTable(List> arrayList) { DataTable dataTable = new DataTable(); //实例化 DataTable result; try { if (arrayList.Count > 0) { foreach (Dictionary dictionary in arrayList) { if (dictionary.Keys.Count() == 0) { result = dataTable; return result; } if (TabItems == null || TabItems.Count == 0) { foreach (string current in dictionary.Keys) { TabItems.Add(new 列显示设置 { 列标题 = current, 是否显示 = true, 显示名称 = current }); } } //在第一次循环时确定datatable的列名,后续循环无需再更改 if (dataTable.Columns.Count == 0) { //此处仅考虑一层json字符串的形式,多层结构需要深入得到叶子节点的key foreach (var current in TabItems) { if(current.是否显示) dataTable.Columns.Add(current.显示名称);//, dictionary[current].GetType()); } } //每次循环增加datatable的Rows DataRow dataRow = dataTable.NewRow(); foreach (var current in TabItems) { if (current.是否显示) dataRow[current.显示名称] = dictionary[current.列标题]; } dataTable.Rows.Add(dataRow); //循环添加行到DataTable中 } } } catch { } result = dataTable; return result; } #endregion } public class 列显示设置 { public string 列标题 { get; set; } public string 显示名称 { get; set; } public bool 是否显示 { get; set; } } }