WPF 后台代码动态向DataGrid添加TextBox、Combox并设置datatrigger

最近项目有个需求需要动态扩展DataGrid,动态扩展列,cell的模板不一样,有的textbox,有的combox,并且需要后台绑定style设置datatrigger

先看combox的

      DataGridTemplateColumn col = new DataGridTemplateColumn();
                                var stackPanelFactory = new FrameworkElementFactory(typeof(StackPanel));
                                stackPanelFactory.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);
                                var comboBox = new FrameworkElementFactory(typeof(ComboBox));
                                comboBox.SetValue(ComboBox.ItemsSourceProperty, item.recipeParameter.DiscriptionList);
                                comboBox.SetValue(ComboBox.SelectedIndexProperty, 0);
                                comboBox.SetValue(ComboBox.TextProperty, item.recipeParameter.DiscriptionList[Convert.ToInt32(item.recipeParameter.DefaultValue)]);
                                comboBox.AddHandler(ComboBox.GotFocusEvent, new RoutedEventHandler(DGCombox_GotFocus));
                                //comboBox.SetBinding(ComboBox.TextProperty, new Binding(item.ColumeName));
                                Style style = new Style();
                                style.TargetType = typeof(ComboBox);
                                DataTrigger dataTrigger = new DataTrigger();
                                dataTrigger.Binding = new Binding
                                {
                                    Path = new PropertyPath("SelectedIndex"),
                                    UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
                                    Mode = BindingMode.Default,
                                    RelativeSource = RelativeSource.Self,
                                };
                                dataTrigger.Value = "-1";
                                dataTrigger.Setters.Add(new Setter(FrameworkElement.VisibilityProperty, Visibility.Hidden));
                                dataTrigger.Setters.Add(new Setter(FrameworkElement.IsEnabledProperty, false));
                                style.Triggers.Add(dataTrigger);
                                comboBox.SetValue(StyleProperty, style);
                                comboBox.SetBinding(ComboBox.TextProperty,
                                       new Binding()
                                       {
                                           UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
                                           Path = new PropertyPath(item.ColumeName),
                                       });
                                stackPanelFactory.AppendChild(comboBox);
                                var dataTemplate = new DataTemplate
                                {
                                    VisualTree = stackPanelFactory
                                };

textbox的

    var stackPanelFactory = new FrameworkElementFactory(typeof(StackPanel));
            stackPanelFactory.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);
            var textBox = new FrameworkElementFactory(typeof(TextBox));
            textBox.SetBinding(TextBox.TextProperty, new Binding(item.ColumeName));
           
            Style style = new Style();
            style.TargetType = typeof(TextBox);
            DataTrigger dataTrigger = new DataTrigger();
            dataTrigger.Binding = new Binding
            {
                Path = new PropertyPath("Text"),
                UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
                Mode = BindingMode.TwoWay,
                RelativeSource = RelativeSource.Self,
            };
            dataTrigger.Value = "'";
            dataTrigger.Setters.Add(new Setter(FrameworkElement.VisibilityProperty, Visibility.Hidden));
            style.Triggers.Add(dataTrigger);
            textBox.SetValue( StyleProperty, style);

            textBox.SetBinding(TextBox.TextProperty,
                new Binding()
                {
                    UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
                    Path = new PropertyPath(item.ColumeName),
                }
                );
            if (item.ColumeName != "Parameter" && item.ColumeName != "Step Name")
            { 
                if (item.recipeParameter.ParamType == "int" || item.recipeParameter.ParamType == "long" || item.recipeParameter.ParamType == "short")
                {
                    textBox.SetValue(ToolTipProperty, item.recipeParameter.Min + "-" + item.recipeParameter.Max);
                    textBox.SetValue(TagProperty, item.recipeParameter.DefaultValue);
                    textBox.AddHandler(TextBox.PreviewTextInputEvent, new TextCompositionEventHandler(NumberText_PreviewTextInput), true);
                    textBox.AddHandler(TextBox.TextChangedEvent, new TextChangedEventHandler(TextBox_TextChanged), true);
                    textBox.AddHandler(TextBox.LostFocusEvent, new RoutedEventHandler(TextBox_LostFocus));
                }
                else if (item.recipeParameter.ParamType == "double")
                {
                    textBox.SetValue(ToolTipProperty, item.recipeParameter.Min + "-" + item.recipeParameter.Max);
                    textBox.SetValue(TagProperty, item.recipeParameter.DefaultValue);
                    textBox.AddHandler(TextBox.PreviewTextInputEvent, new TextCompositionEventHandler(NumberdoubleText_PreviewTextInput), true);
                    textBox.AddHandler(TextBox.TextChangedEvent, new TextChangedEventHandler(TextBox_TextChanged), true);
                    textBox.AddHandler(TextBox.LostFocusEvent, new RoutedEventHandler(TextBox_LostFocus));
                }
            }
            textBox.SetValue(BorderBrushProperty, null);
            textBox.SetValue(MinWidthProperty, (double)100);
            stackPanelFactory.AppendChild(textBox);

            var dataTemplate = new DataTemplate
            {
                VisualTree = stackPanelFactory
            };
            var templateColumn = new DataGridTemplateColumn
            {
                Header = item.ColumeName,
                CellTemplate = dataTemplate
            };

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这个月太忙没时间看C++

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值