带有可选按钮列的自定义 WPF DataGrid

Custom WPF DataGrid with optional button column

我正在创建一个自定义 DataGrid 控件,它有一个 属性、ShowCloneColumn。如果将此 属性 设置为 true,则 DataGrid 应添加另一列带有按钮。

我创建的 class 派生自 DataGrid 并实现了一个依赖项 属性,ShowCloneColumn。

    public static readonly DependencyProperty ShowCloneColumnProperty =
            DependencyProperty.Register("ShowCloneColumn", 
            typeof(bool),
            typeof(CloneRowDataGrid),
            new FrameworkPropertyMetadata(false, 
                FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
                OnShowCloneColumnPropertyChanged));

    public bool ShowCloneColumn
    {
        get { return (bool) GetValue(ShowCloneColumnProperty); }
        set { SetValue(ShowCloneColumnProperty, value); }
    }

在 Generic.xaml 我有以下样式。

<!-- Somewhere in here a button column should be declared? -->
<Style TargetType="{x:Type uiControls:CloneRowDataGrid}" BasedOn="{StaticResource {x:Type DataGrid}}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type uiControls:CloneRowDataGrid}">
                    <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="ShowCloneColumn" Value="True">
                            <!-- Show clone column, a column with a button -->
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

我对模板和自定义控件还不是很了解,所以我不太确定在哪里添加按钮列,以便当有人使用 CloneRowDataGrid 并设置依赖项时它会可见 属性 ShowCloneColumn 为真。

我必须从 Generic.xaml 样式中删除部分,以便 DataGrid 正确布局并在代码中创建列。

        protected override void OnInitialized(EventArgs e)
        {
            base.OnInitialized(e);

            CloneColumn.Visibility = ShowCloneColumn ? Visibility.Visible : Visibility.Hidden;
        }

        private DataGridTemplateColumn _cloneColumn;
        private DataGridTemplateColumn CloneColumn
        {
            get
            {
                if (_cloneColumn == null)
                {
                    _cloneColumn = new DataGridTemplateColumn
                    {
                        Header = string.Empty,
                        Visibility = ShowCloneColumn ? Visibility.Visible : Visibility.Hidden
                    };
                    FrameworkElementFactory buttonFactory = new FrameworkElementFactory(typeof (Button));
                    buttonFactory.SetValue(Button.ContentProperty, "Clone");
                    buttonFactory.AddHandler(Button.ClickEvent, new RoutedEventHandler(CloneButtonClicked));
                    DataTemplate textTemplate = new DataTemplate {VisualTree = buttonFactory};
                    _cloneColumn.CellTemplate = textTemplate;
                    Columns.Add(_cloneColumn);
                }
                return _cloneColumn;
            }
        }