C# XCeed 通过代码动态创建 PropertyGrid

C# XCeed creating PropertyGrid dynamically by code

我正在尝试在代码中动态创建 PropertyGrid。到目前为止,我可以在 XAML 中创建和自定义一个 PropertyGrid 致谢:XCeed PropertyGrid 自定义 IntegerUpDown :
MainWindow.xaml.cs:

public MainWindow()    
        {   
        InitializeComponent();

        Sample or = new Sample();
        pg.SelectedObject = or;
        pg.ShowAdvancedOptions = true;
        EditorDefinition ed = new EditorDefinition();
        PropertyDefinition pd = new PropertyDefinition();
        pd.Name = "Value";
        ed.PropertyDefinitions.Add(pd);
        DataTemplate dt = new DataTemplate();

        FrameworkElementFactory fac = new FrameworkElementFactory(typeof(PropertyGridEditorIntegerUpDown));
        dt.VisualTree = fac;

        DependencyProperty dp = PropertyGridEditorIntegerUpDown.DefaultValueProperty;


        fac.SetValue(dp, 10);

        ed.EditorTemplate = dt;
        pg.EditorDefinitions.Add(ed);
        }

MainWindow.xaml:

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" xmlns:xcdg="http://schemas.xceed.com/wpf/xaml/datagrid" x:Class="WpfApp1.MainWindow"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <xctk:PropertyGrid x:Name="pg">
<xctk:PropertyGrid.EditorDefinitions >

                      <xctk:EditorDefinition >

                           <xctk:EditorDefinition.PropertiesDefinitions >

                                < xctk:PropertyDefinition Name = "Value" />

                             </xctk:EditorDefinition.PropertiesDefinitions >

                              <xctk:EditorDefinition.EditorTemplate >

                                   <DataTemplate >

                                       <xctk:PropertyGridEditorIntegerUpDown Increment = "10" Value = "{Binding Value}" Maximum = "40" MinHeight = "0" Minimum = "-30" />

                                            </DataTemplate >

                                        </xctk:EditorDefinition.EditorTemplate >

                                     </xctk:EditorDefinition >

                                  </xctk:PropertyGrid.EditorDefinitions >
    </xctk:PropertyGrid >  
</Window>

和示例 class:

public class Sample
    {
        private int _Value;

        #region Public Properties

        [Category("Sample")]
        [DisplayName("Sample Value")]
        [DefaultValue(3)]
        public int Value { set; get; }

       #endregion

    }

这将是等效的代码:

EditorDefinition ed = new EditorDefinition();
PropertyDefinition pd = new PropertyDefinition();
pd.Name = "Value";
ed.PropertiesDefinitions.Add(pd);

FrameworkElementFactory fac = new FrameworkElementFactory(typeof(PropertyGridEditorIntegerUpDown));
fac.SetBinding(PropertyGridEditorIntegerUpDown.ValueProperty, new Binding("Value"));
fac.SetValue(PropertyGridEditorIntegerUpDown.IncrementProperty, 10);

DataTemplate dt = new DataTemplate { VisualTree = fac };
dt.Seal();
ed.EditorTemplate = dt;
pg.EditorDefinitions.Add(ed);