using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Media; using Venus_Core; using Venus_Core.Attributes; using Venus_Unity; using Newtonsoft.Json; namespace Aitex.UI.RecipeEditor { public class RecipeEditorControlViewModel : INotifyPropertyChanged { //当前选中的配方 private Recipe m_currentRecipe; public Recipe CurrentRecipe { get { return m_currentRecipe; } set { m_currentRecipe = value; InvokePropertyChanged("CurrentRecipe"); } } public StackPanel GridStackPanel { get; set; } //step容器 List solidColorBrushes = new List();//step模块颜色 public WrapPanel HeadWrapPanel { get; set; } //head容器 Grid currentGrid; private int copyIndex=-1; public RecipeEditorControlViewModel() { solidColorBrushes.Add(new SolidColorBrush(Colors.Coral)); solidColorBrushes.Add(new SolidColorBrush(Colors.Cyan)); solidColorBrushes.Add(new SolidColorBrush(Colors.Honeydew)); } public void OnAddStep(int index) { if (CurrentRecipe != null) { RecipeStep recipeStep; if (copyIndex == -1) { recipeStep = new RecipeStep(); recipeStep.LstUnit.Add(new PressureByPressureModeUnit()); recipeStep.LstUnit.Add(new TCPUnit()); recipeStep.LstUnit.Add(new BiasUnit()); recipeStep.LstUnit.Add(new GasControlUnit()); recipeStep.LstUnit.Add(new ESCHVUnit()); recipeStep.LstUnit.Add(new ProcessKitUnit()); CurrentRecipe.Steps.Insert(index-1,recipeStep); } else { var t= JsonConvert.SerializeObject(CurrentRecipe); recipeStep= Recipe.Load(t).Steps[copyIndex - 1]; CurrentRecipe.Steps.Insert(index-1, recipeStep); } RecipeStepToGridColumn(recipeStep, currentGrid, index,true ); for (int i = 1; i <= CurrentRecipe.Steps.Count; i++) { CurrentRecipe.Steps[i - 1].StepNo = i; } } } public void OnDeleteStep(int index) { if (CurrentRecipe != null && CurrentRecipe.Steps.Count>1) { CurrentRecipe.Steps.RemoveAt(index); currentGrid.Children.RemoveRange(currentGrid.RowDefinitions.Count * (index+1), currentGrid.RowDefinitions.Count); for (int i = 1; i <= CurrentRecipe.Steps.Count; i++) { CurrentRecipe.Steps[i - 1].StepNo = i; } } } //int index = 0; /// /// 选中recipe,显示界面 /// /// public void LoadRecipe(Recipe recipe) { copyIndex = -1; GridStackPanel.Children.Clear(); CurrentRecipe = null; GC.Collect(); // This should pick up the control removed at a previous MouseDown GC.WaitForPendingFinalizers(); // Doesn't help either GC.Collect(); GC.WaitForPendingFinalizers(); // Doesn't help either CurrentRecipe = recipe; Grid grid = new Grid(); grid.Margin = new Thickness(15); //index = 0; for (int i = 0; i < recipe.Steps.Count; i++) { RecipeStepToGridColumn(recipe.Steps[i], grid,i,false); } GridStackPanel.Children.Add(grid); LoadHeadWrapPanel(recipe); currentGrid = grid; } /// /// 选中recipe,头部界面显示 /// /// private void LoadHeadWrapPanel(Recipe recipe) { HeadWrapPanel.Children.Clear(); Type type = recipe.Header.GetType(); foreach (var propertyInfo in type.GetProperties()) { TextBlock textBlock = new TextBlock(); textBlock.FontSize = 15; //textBlock.Width = 100; textBlock.Text = propertyInfo.Name + ":"; textBlock.Margin = new Thickness(15, 0, 0, 0); textBlock.VerticalAlignment = VerticalAlignment.Center; HeadWrapPanel.Children.Add(textBlock); Binding binding = new Binding() { Source = recipe.Header, // 数据源 Path = new PropertyPath(propertyInfo.Name), // 需绑定的数据源属性名 Mode = BindingMode.TwoWay, // 绑定模式 UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged //触发器 }; var propertyTypeName = propertyInfo.PropertyType.Name; var propertyInfoName=propertyInfo.Name; Control control = new Control(); switch (propertyTypeName) { case "Int32": case "String": control = new TextBox(); control.Margin = new Thickness(1, 0, 0, 0); control.BorderThickness = new Thickness(0,0,0,1); //control.BorderBrush = Brushes.Black; control.FontSize = 15; control.Foreground = Brushes.Green; control.Background = Brushes.Transparent; control.VerticalAlignment = VerticalAlignment.Center; control.MinWidth = 15; control.SetBinding(TextBox.TextProperty, binding); object[] objAttrs = propertyInfo.GetCustomAttributes(typeof(IsOnlyReadAttribute), true); if (objAttrs.Length > 0) { (control as TextBox).IsReadOnly = true; } break; case "Boolean": control = new CheckBox(); control.SetBinding(CheckBox.IsCheckedProperty, binding); break; default: control = new ComboBox(); control.Height = 23; control.SetBinding(ComboBox.SelectedItemProperty, binding); ItemsControlHelper.SetEnumValuesToItemsSource(control, true); break; } HeadWrapPanel.Children.Add(control); } } private void RecipeStepToGridColumn(RecipeStep recipeStep, Grid grid,int index,bool isInsert) { int location = 1; if (isInsert == true) { location -= 1; } Type recipeType = recipeStep.GetType(); int cycleCount = 1; if (index == 0) { cycleCount = 2; } for (int j = 0; j< cycleCount; j++) { int i = 0; ColumnDefinition col1 = new ColumnDefinition(); //col1.MinWidth = 50; grid.ColumnDefinitions.Insert(index,col1); Binding stepcheckbinding = null; //grid.MinWidth = 200; foreach (PropertyInfo propertyInfo in recipeType.GetProperties()) { string propertyInfoName = propertyInfo.Name; string propertyTypeName = propertyInfo.PropertyType.Name; if (propertyInfoName != "LstUnit") { if (index == 0 && grid.ColumnDefinitions.Count == 1) { RowDefinition row1 = new RowDefinition(); grid.RowDefinitions.Add(row1); } if (grid.ColumnDefinitions.Count == 1 && j == 0) { TextBox textBlock = new TextBox(); textBlock.IsReadOnly = true; textBlock.Text = propertyInfoName; grid.Children.Add(textBlock); textBlock.Background = new SolidColorBrush(Colors.BurlyWood); Grid.SetRow(textBlock, i); Grid.SetColumn(textBlock, 0); } else { Binding binding = new Binding() { Source = recipeStep, // 数据源 Path = new PropertyPath(propertyInfoName), // 需绑定的数据源属性名 Mode = BindingMode.TwoWay, // 绑定模式 UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged //触发器 }; switch (propertyTypeName) { case "Int32": case "String": TextBox textBox = new TextBox(); if (stepcheckbinding == null) { textBox.IsEnabled = true; } else { textBox.SetBinding(TextBox.IsEnabledProperty, stepcheckbinding); } textBox.SetBinding(TextBox.TextProperty, binding); grid.Children.Add(textBox); Grid.SetRow(textBox, i); Grid.SetColumn(textBox, index + location); object[] objAttrs = propertyInfo.GetCustomAttributes(typeof(IsOnlyReadAttribute), true); if (objAttrs.Length > 0) { textBox.IsReadOnly = true; ContextMenu contextmenu = new ContextMenu(); textBox.ContextMenu = contextmenu; MenuItem menuItemDelete = new MenuItem(); menuItemDelete.Header = "删除"; menuItemDelete.Click += MenuItemDelete_Click; MenuItem menuItemLeftInsert = new MenuItem(); menuItemLeftInsert.Header = "左插入"; menuItemLeftInsert.Click += MenuItemLeftInsert_Click; MenuItem menuItemRightInsert = new MenuItem(); menuItemRightInsert.Header = "右插入"; menuItemRightInsert.Click += MenuItemRightInsert_Click; MenuItem menuItemCopy = new MenuItem(); menuItemCopy.Tag = textBox.Text; menuItemCopy.Header = "复制"; menuItemCopy.Click += MenuItemCopy_Click; contextmenu.Items.Add(menuItemCopy); contextmenu.Items.Add(menuItemDelete); contextmenu.Items.Add(menuItemLeftInsert); contextmenu.Items.Add(menuItemRightInsert); } break; case "Boolean": CheckBox checkBox = new CheckBox(); checkBox.SetBinding(CheckBox.IsCheckedProperty, binding); grid.Children.Add(checkBox); Grid.SetRow(checkBox, i); Grid.SetColumn(checkBox, index + location); if (stepcheckbinding == null) { stepcheckbinding = new Binding { Source = checkBox, // 数据源 Path = new PropertyPath("IsChecked"), // 需绑定的数据源属性名 Mode = BindingMode.TwoWay, // 绑定模式 UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged //触发器 }; } else { if (stepcheckbinding == null) { checkBox.IsEnabled = true; } else { checkBox.SetBinding(TextBox.IsEnabledProperty, stepcheckbinding); } } break; default: ComboBox comboBox = new ComboBox(); comboBox.Style = new Style(); comboBox.SetBinding(ComboBox.SelectedItemProperty, binding); ItemsControlHelper.SetEnumValuesToItemsSource(comboBox, true); grid.Children.Add(comboBox); Grid.SetRow(comboBox, i); Grid.SetColumn(comboBox, index + location); if (stepcheckbinding == null) { comboBox.IsEnabled = true; } else { comboBox.SetBinding(TextBox.IsEnabledProperty, stepcheckbinding); } break; } } i++; } } int k = 0; recipeStep.LstUnit.ToList().ForEach(x => { Type unitType = x.GetType(); Binding checkbinding = null; foreach (PropertyInfo propertyInfo in unitType.GetProperties()) { if (index == 0 && grid.ColumnDefinitions.Count == 1) { RowDefinition row1 = new RowDefinition(); grid.RowDefinitions.Add(row1); } if (grid.ColumnDefinitions.Count == 1 && j == 0) { TextBox textBlock = new TextBox(); textBlock.IsReadOnly = true; textBlock.Text = propertyInfo.Name; textBlock.Background = solidColorBrushes[k % 3]; grid.Children.Add(textBlock); Grid.SetRow(textBlock, i); Grid.SetColumn(textBlock, 0); } else { Binding binding = new Binding() { Source = recipeStep.LstUnit[k], // 数据源 //Path = new PropertyPath($"LstUnit[{k}]." + propertyInfo.Name), // 需绑定的数据源属性名 Path = new PropertyPath(propertyInfo.Name), // 需绑定的数据源属性名 Mode = BindingMode.TwoWay, // 绑定模式 UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged //触发器 }; var item = propertyInfo.PropertyType.Name; if (propertyInfo.Name == "UnitName") { TextBox textBlock1 = new TextBox(); textBlock1.Text = propertyInfo.GetValue(x).ToString(); textBlock1.IsReadOnly = true; grid.Children.Add(textBlock1); Grid.SetRow(textBlock1, i); Grid.SetColumn(textBlock1, index + location); } else { switch (item) { case "Int32": case "String": TextBox textBox = new TextBox(); if (checkbinding == null) { textBox.IsEnabled = true; } else { textBox.SetBinding(TextBox.IsEnabledProperty, checkbinding); } textBox.SetBinding(TextBox.TextProperty, binding); grid.Children.Add(textBox); Grid.SetRow(textBox, i); Grid.SetColumn(textBox, index + location); object[] objAttrs = propertyInfo.GetCustomAttributes(typeof(IsOnlyReadAttribute), true); if (objAttrs.Length > 0) { textBox.IsReadOnly = true; } break; case "Boolean": CheckBox checkBox = new CheckBox(); if (checkbinding == null) { checkbinding = new Binding { Source = checkBox, // 数据源 Path = new PropertyPath("IsChecked"), // 需绑定的数据源属性名 Mode = BindingMode.TwoWay, // 绑定模式 UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged //触发器 }; } checkBox.SetBinding(CheckBox.IsCheckedProperty, binding); grid.Children.Add(checkBox); Grid.SetRow(checkBox, i); Grid.SetColumn(checkBox, index+location); break; default: ComboBox comboBox = new ComboBox(); if (checkbinding == null) { comboBox.IsEnabled = true; } else { comboBox.SetBinding(TextBox.IsEnabledProperty, checkbinding); } comboBox.Style = new Style(); comboBox.Background = Brushes.White; string path = propertyInfo.Name; comboBox.SetBinding(ComboBox.SelectedItemProperty, binding); ItemsControlHelper.SetEnumValuesToItemsSource(comboBox, true); grid.Children.Add(comboBox); Grid.SetRow(comboBox, i); Grid.SetColumn(comboBox, index + location); break; } } } i++; } k++; }); //index++; } } //private void RecipeStepToGridColumn(RecipeStep recipeStep, Grid grid) //{ // try // { // Type recipeType = recipeStep.GetType(); // int i = 0; // if (grid.ColumnDefinitions.Count == 0) // { // ColumnDefinition col1 = new ColumnDefinition();//Key // grid.ColumnDefinitions.Add(col1); // } // ColumnDefinition col2 = new ColumnDefinition();//Value // grid.ColumnDefinitions.Add(col2); // foreach (PropertyInfo propertyInfo in recipeType.GetProperties()) // { // string propertyInfoName = propertyInfo.Name; // string propertyTypeName = propertyInfo.PropertyType.Name; // if (propertyInfoName != "LstUnit") // { // if (index == 0) // { // RowDefinition row1 = new RowDefinition(); // grid.RowDefinitions.Add(row1); // } // Binding binding = new Binding() // { // Source = recipeStep, // 数据源 // Path = new PropertyPath(propertyInfoName), // 需绑定的数据源属性名 // Mode = BindingMode.TwoWay, // 绑定模式 // UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged //触发器 // }; // switch (propertyTypeName) // { // case "Int32": // case "String": // TextBox textBox = new TextBox(); // textBox.SetBinding(TextBox.TextProperty, binding); // grid.Children.Add(textBox); // Grid.SetRow(textBox, i); // Grid.SetColumn(textBox, grid.ColumnDefinitions.Count - 1); // object[] objAttrs = propertyInfo.GetCustomAttributes(typeof(IsOnlyReadAttribute), true); // if (objAttrs.Length > 0) // { // textBox.IsReadOnly = true; // //textBox.SetBinding(TextBox.TextProperty, currentGrid.ColumnDefinitions.c); // ContextMenu contextmenu = new ContextMenu(); // textBox.ContextMenu = contextmenu; // MenuItem menuItemDelete = new MenuItem(); // menuItemDelete.Header = "删除"; // menuItemDelete.Click += MenuItemDelete_Click; // MenuItem menuItemInsert = new MenuItem(); // menuItemInsert.Header = "左插入"; // menuItemInsert.Click += MenuItemInsert_Click; // MenuItem menuItemCopy = new MenuItem(); // menuItemCopy.Tag = textBox.Text; // menuItemCopy.Header = "复制"; // menuItemCopy.Click += MenuItemCopy_Click; // contextmenu.Items.Add(menuItemCopy); // contextmenu.Items.Add(menuItemDelete); // contextmenu.Items.Add(menuItemInsert); // } // break; // case "Boolean": // CheckBox checkBox = new CheckBox(); // checkBox.SetBinding(CheckBox.IsCheckedProperty, binding); // grid.Children.Add(checkBox); // Grid.SetRow(checkBox, i); // Grid.SetColumn(checkBox, grid.ColumnDefinitions.Count - 1); // break; // default: // ComboBox comboBox = new ComboBox(); // comboBox.Style = new Style(); // comboBox.SetBinding(ComboBox.SelectedItemProperty, binding); // ItemsControlHelper.SetEnumValuesToItemsSource(comboBox, true); // grid.Children.Add(comboBox); // Grid.SetRow(comboBox, i); // Grid.SetColumn(comboBox, grid.ColumnDefinitions.Count - 1); // break; // } // if (grid.ColumnDefinitions.Count == 2) // { // TextBox textBlock = new TextBox(); // textBlock.IsReadOnly = true; // textBlock.Text = propertyInfoName; // grid.Children.Add(textBlock); // textBlock.Background = new SolidColorBrush(Colors.BurlyWood); // Grid.SetRow(textBlock, i); // Grid.SetColumn(textBlock, 0); // } // i++; // } // } // List ints = new List(); // ints.Add(recipeType.GetProperties().Length); // int k = 0; // recipeStep.LstUnit.ToList().ForEach(x => // { // Type unitType = x.GetType(); // Binding checkbinding = null; // foreach (PropertyInfo propertyInfo in unitType.GetProperties()) // { // Binding binding = new Binding() // { // Source = recipeStep.LstUnit[k], // 数据源 // //Path = new PropertyPath($"LstUnit[{k}]." + propertyInfo.Name), // 需绑定的数据源属性名 // Path = new PropertyPath(propertyInfo.Name), // 需绑定的数据源属性名 // Mode = BindingMode.TwoWay, // 绑定模式 // UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged //触发器 // }; // if (index == 0) // { // RowDefinition row1 = new RowDefinition(); // grid.RowDefinitions.Add(row1); // } // var item = propertyInfo.PropertyType.Name; // if (propertyInfo.Name == "UnitName") // { // TextBox textBlock1 = new TextBox(); // //textBlock1.SetBinding(TextBlock.TextProperty, binding); // textBlock1.Text = propertyInfo.GetValue(x).ToString(); // //textBlock1.BorderThickness = new Thickness(0); // //textBlock1.Foreground = Brushes.Red; // textBlock1.IsReadOnly = true; // //textBlock1.HorizontalAlignment = HorizontalAlignment.Center; // grid.Children.Add(textBlock1); // Grid.SetRow(textBlock1, i); // Grid.SetColumn(textBlock1, grid.ColumnDefinitions.Count - 1); // } // else // { // //CheckBox check = new CheckBox(); // //check.IsChecked = false; // switch (item) // { // case "Int32": // case "String": // TextBox textBox = new TextBox(); // //textBox.SetBinding(TextBox.IsEnabledProperty, check.IsChecked); // //textBox.IsEnabled= true; // if (checkbinding == null) // { // textBox.IsEnabled = true; // } // else // { // textBox.SetBinding(TextBox.IsEnabledProperty, checkbinding); // } // //textBox.BorderBrush = Brushes.Transparent; // //textBox.BorderThickness = new Thickness(0); // textBox.SetBinding(TextBox.TextProperty, binding); // grid.Children.Add(textBox); // Grid.SetRow(textBox, i); // Grid.SetColumn(textBox, grid.ColumnDefinitions.Count - 1); // object[] objAttrs = propertyInfo.GetCustomAttributes(typeof(IsOnlyReadAttribute), true); // if (objAttrs.Length > 0) // { // textBox.IsReadOnly = true; // } // break; // case "Boolean": // CheckBox checkBox = new CheckBox(); // checkbinding = new Binding // { // Source = checkBox, // 数据源 // //Path = new PropertyPath($"LstUnit[{k}]." + propertyInfo.Name), // 需绑定的数据源属性名 // Path = new PropertyPath("IsChecked"), // 需绑定的数据源属性名 // Mode = BindingMode.TwoWay, // 绑定模式 // UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged //触发器 // }; // //checkbinding = binding; // //checkBox.Margin = new Thickness(1); // checkBox.SetBinding(CheckBox.IsCheckedProperty, binding); // grid.Children.Add(checkBox); // Grid.SetRow(checkBox, i); // Grid.SetColumn(checkBox, grid.ColumnDefinitions.Count - 1); // break; // default: // ComboBox comboBox = new ComboBox(); // if (checkbinding == null) // { // comboBox.IsEnabled = true; // } // else // { // comboBox.SetBinding(TextBox.IsEnabledProperty, checkbinding); // } // comboBox.Style = new Style(); // comboBox.Background = Brushes.White; // string path = propertyInfo.Name; // comboBox.SetBinding(ComboBox.SelectedItemProperty, binding); // ItemsControlHelper.SetEnumValuesToItemsSource(comboBox, true); // grid.Children.Add(comboBox); // Grid.SetRow(comboBox, i); // Grid.SetColumn(comboBox, grid.ColumnDefinitions.Count - 1); // break; // } // } // if (grid.ColumnDefinitions.Count == 2) // { // TextBox textBlock = new TextBox(); // textBlock.IsReadOnly = true; // textBlock.Text = propertyInfo.Name; // textBlock.Background = solidColorBrushes[k % 3]; // grid.Children.Add(textBlock); // Grid.SetRow(textBlock, i); // Grid.SetColumn(textBlock, 0); // } // i++; // } // ints.Add(unitType.GetProperties().Length); // k++; // }); // index++; // } // catch // { } // //return new ValueTuple>(grid, ints); //} /// /// step转换为Grid /// /// /// private ValueTuple> RecipeStepToGrid(RecipeStep recipeStep) { Grid grid = new Grid(); ContextMenu contextmenu = new ContextMenu(); contextmenu.Tag = grid; grid.ContextMenu= contextmenu; MenuItem menuItemDelete = new MenuItem(); menuItemDelete.Header = "删除"; menuItemDelete.Click += MenuItemDelete_Click; MenuItem menuItemInsert = new MenuItem(); menuItemInsert.Header = "左插入"; menuItemInsert.Click += MenuItemLeftInsert_Click; contextmenu.Items.Add(menuItemDelete); contextmenu.Items.Add(menuItemInsert); List ints = new List(); ColumnDefinition col1 = new ColumnDefinition();//Key ColumnDefinition col2 = new ColumnDefinition();//Value grid.ColumnDefinitions.Add(col1); grid.ColumnDefinitions.Add(col2); GridOptions.SetShowBorder(grid, true); GridOptions.SetLineBrush(grid, Brushes.White); GridOptions.SetLineThickness(grid, 1); grid.Margin = new Thickness(15, 5, 0, 0); Type recipeType = recipeStep.GetType(); int i = 0; foreach (PropertyInfo propertyInfo in recipeType.GetProperties()) { string propertyInfoName = propertyInfo.Name; string propertyTypeName = propertyInfo.PropertyType.Name; if (propertyInfoName != "LstUnit") { RowDefinition row1 = new RowDefinition(); grid.RowDefinitions.Add(row1); Binding binding = new Binding() { Source = recipeStep, // 数据源 Path = new PropertyPath(propertyInfoName), // 需绑定的数据源属性名 Mode = BindingMode.TwoWay, // 绑定模式 UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged //触发器 }; switch (propertyTypeName) { case "Int32": case "String": TextBox textBox = new TextBox(); textBox.SetBinding(TextBox.TextProperty, binding); grid.Children.Add(textBox); Grid.SetRow(textBox, i); Grid.SetColumn(textBox, 1); object[] objAttrs = propertyInfo.GetCustomAttributes(typeof(IsOnlyReadAttribute), true); if (objAttrs.Length > 0) { textBox.IsReadOnly = true; } break; case "Boolean": CheckBox checkBox = new CheckBox(); checkBox.SetBinding(CheckBox.IsCheckedProperty, binding); grid.Children.Add(checkBox); Grid.SetRow(checkBox, i); Grid.SetColumn(checkBox, 1); break; default: ComboBox comboBox = new ComboBox(); comboBox.SetBinding(ComboBox.SelectedItemProperty, binding); ItemsControlHelper.SetEnumValuesToItemsSource(comboBox, true); grid.Children.Add(comboBox); Grid.SetRow(comboBox, i); Grid.SetColumn(comboBox, 1); if (propertyInfo.Name == "PressureUnitMode") { comboBox.SelectionChanged += ComboBox_SelectionChanged; } break; } TextBlock textBlock = new TextBlock(); textBlock.Text = propertyInfoName; grid.Children.Add(textBlock); Grid.SetRow(textBlock, i); Grid.SetColumn(textBlock, 0); i++; } } ints.Add(recipeType.GetProperties().Length); int k = 0; recipeStep.LstUnit.ToList().ForEach(x => { Type unitType = x.GetType(); foreach (PropertyInfo propertyInfo in unitType.GetProperties()) { Binding binding = new Binding() { Source = recipeStep.LstUnit[k], // 数据源 //Path = new PropertyPath($"LstUnit[{k}]." + propertyInfo.Name), // 需绑定的数据源属性名 Path = new PropertyPath(propertyInfo.Name), // 需绑定的数据源属性名 Mode = BindingMode.TwoWay, // 绑定模式 UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged //触发器 }; RowDefinition row1 = new RowDefinition(); grid.RowDefinitions.Add(row1); var item = propertyInfo.PropertyType.Name; if (propertyInfo.Name == "UnitName") { TextBlock textBlock1 = new TextBlock(); //textBlock1.SetBinding(TextBlock.TextProperty, binding); textBlock1.Text = propertyInfo.GetValue(x).ToString(); textBlock1.Foreground = Brushes.Red; //textBlock1.HorizontalAlignment = HorizontalAlignment.Center; grid.Children.Add(textBlock1); Grid.SetRow(textBlock1, i); Grid.SetColumn(textBlock1, 1); } else { switch (item) { case "Int32": case "String": TextBox textBox = new TextBox(); textBox.BorderBrush = Brushes.Transparent; textBox.SetBinding(TextBox.TextProperty, binding); grid.Children.Add(textBox); Grid.SetRow(textBox, i); Grid.SetColumn(textBox, 1); object[] objAttrs = propertyInfo.GetCustomAttributes(typeof(IsOnlyReadAttribute), true); if (objAttrs.Length > 0) { textBox.IsReadOnly = true; } break; case "Boolean": CheckBox checkBox = new CheckBox(); checkBox.SetBinding(CheckBox.IsCheckedProperty, binding); grid.Children.Add(checkBox); Grid.SetRow(checkBox, i); Grid.SetColumn(checkBox, 1); break; default: ComboBox comboBox = new ComboBox(); comboBox.BorderBrush = Brushes.Transparent; //comboBox.Background = Brushes.White; string path = propertyInfo.Name; comboBox.SetBinding(ComboBox.SelectedItemProperty, binding); ItemsControlHelper.SetEnumValuesToItemsSource(comboBox, true); grid.Children.Add(comboBox); Grid.SetRow(comboBox, i); Grid.SetColumn(comboBox, 1); break; } } TextBlock textBlock = new TextBlock(); textBlock.Text = propertyInfo.Name; grid.Children.Add(textBlock); Grid.SetRow(textBlock, i); Grid.SetColumn(textBlock, 0); i++; } ints.Add(unitType.GetProperties().Length); k++; }); return new ValueTuple>(grid, ints); } private void MenuItemLeftInsert_Click(object sender, RoutedEventArgs e) { var t = ((sender as MenuItem).Parent as ContextMenu).PlacementTarget as TextBox; int insertIndex = Convert.ToInt32(t.Text); OnAddStep(insertIndex); } private void MenuItemRightInsert_Click(object sender, RoutedEventArgs e) { var t = ((sender as MenuItem).Parent as ContextMenu).PlacementTarget as TextBox; int insertIndex = Convert.ToInt32(t.Text); OnAddStep(insertIndex+1); } private void MenuItemDelete_Click(object sender, RoutedEventArgs e) { var t = ((sender as MenuItem).Parent as ContextMenu).PlacementTarget as TextBox; int deleteIndex = Convert.ToInt32(t.Text); OnDeleteStep(deleteIndex - 1); } private void MenuItemCopy_Click(object sender, RoutedEventArgs e) { var t= ((sender as MenuItem).Parent as ContextMenu).PlacementTarget as TextBox; copyIndex =Convert.ToInt32( t.Text); } /// /// 获取父控件 /// /// /// /// /// public T GetParentObject2(DependencyObject obj, string name) where T : FrameworkElement { DependencyObject parent = VisualTreeHelper.GetParent(obj); while (parent != null) { if (parent is T && (((T)parent).Name == name || string.IsNullOrEmpty(name))) { return (T)parent; } parent = VisualTreeHelper.GetParent(parent); } return null; } private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (e.RemovedItems.Count > 0) { ComboBox comboBox = sender as ComboBox; Grid grid = GetParentObject(comboBox, ""); int index= GridStackPanel.Children.IndexOf(grid); RecipeStep recipeStep = CurrentRecipe.Steps[index]; recipeStep.LstUnit.RemoveAt(0); if (comboBox.SelectedIndex == 0) { recipeStep.LstUnit.Insert(0, new PressureByPressureModeUnit()); } else { recipeStep.LstUnit.Insert(0, new PressureByValveModeUnit()); } GridStackPanel.Children.Remove(grid); GridStackPanel.Children.Insert(index, RecipeStepToGrid(recipeStep).Item1); } } public T GetParentObject(DependencyObject obj, string name) where T : FrameworkElement { DependencyObject parent = VisualTreeHelper.GetParent(obj); while (parent != null) { if (parent is T && (((T)parent).Name == name || string.IsNullOrEmpty(name))) { return (T)parent; } parent = VisualTreeHelper.GetParent(parent); } return null; } private Tuple> RecipeStepToDataGrid(RecipeStep recipeStep) { DataGrid dataGrid = new DataGrid(); List ints = new List(); DataTable dataTable = new DataTable(); dataTable.Columns.Add("Key"); dataTable.Columns.Add("Value"); dataGrid.CanUserAddRows = false; dataGrid.AutoGenerateColumns = true; dataGrid.SelectionUnit = DataGridSelectionUnit.Cell; dataGrid.SetValue(System.Windows.Controls.VirtualizingStackPanel.IsVirtualizingProperty, false); Type recipeType = recipeStep.GetType(); foreach (PropertyInfo propertyInfo in recipeType.GetProperties()) { if (propertyInfo.Name != "LstUnit") { dataTable.Rows.Add(propertyInfo.Name, propertyInfo.GetValue(recipeStep)); } } ints.Add(dataTable.Rows.Count); recipeStep.LstUnit.ToList().ForEach(k => { //List dynamics = new List(); Type type = k.GetType(); ints.Add(type.GetProperties().Length); foreach (PropertyInfo propertyInfo in type.GetProperties()) { var name = propertyInfo.Name; var value = propertyInfo.GetValue(k); //dynamicModel.PropertyName = name; //dynamicModel.Property = value; dataTable.Rows.Add(name, value); } }); dataGrid.ItemsSource = dataTable.DefaultView; //}); return new Tuple>(dataGrid, ints); } private void ChangeDataGridRowColor(DataGrid dataGrid,List ints) { int count = 0; for (int i = 0; i < ints.Count; i++) { for (int j = 0; j < ints[i]; j++) { dataGrid.UpdateLayout(); int index = count + j; DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromItem(dataGrid.Items[index]) as DataGridRow; row.Background = solidColorBrushes[i]; } count += ints[i]; } } private void ChangeGridRowColor(Grid grid, List ints) { int count = 0; for (int i = 0; i < ints.Count; i++) { for (int j = 0; j < ints[i]; j++) { //dataGrid.UpdateLayout(); int index = count + j; //DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromItem(dataGrid.Items[index]) as DataGridRow; //grid.RowDefinitions[index] } count += ints[i]; } } #region INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged; public void InvokePropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } #endregion INotifyPropertyChanged } }