制作自定义DataGrid

时间:2013-11-25 18:09:19

标签: c# wpf custom-controls

我想创建一个自定义WPF DataGrid,它包含一个自定义上下文菜单以及一些自定义键绑定。它需要是某种自定义控件,因为我们将有许多相同数据网格的实例。

到目前为止,我有以下内容:

public class MyDataGrid : DataGrid
{
    static MyDataGrid()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(MyDataGrid), new FrameworkPropertyMetadata(typeof(MyDataGrid)));
    }
}

在Themes文件夹中,我有MyDataGrid.xaml,其中包含:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Style TargetType="{x:Type DataGrid}">
        <Setter Property="ContextMenu">
            <Setter.Value>
                <ContextMenu>
                    <MenuItem Header="Copy" Command="{Binding CopyCommand}" />
                    <MenuItem Header="Paste" Command="{Binding PasteCommand }" />
                    <Separator />
                    <MenuItem Header="Insert" Command="{Binding InsertCommand }" />
                    <MenuItem Header="Delete" Command="{Binding DeleteCommand }" />
                    <Separator />
                    <MenuItem Header="Move Up" Command="{Binding MoveUpCommand }" />
                    <MenuItem Header="Move Down" Command="{Binding MoveDownCommand }" />
                </ContextMenu>
            </Setter.Value>
        </Setter>
    </Style>

</ResourceDictionary>

但是,当我创建一个控件实例时,它只是空白。

<custom:MyDataGrid
    ItemsSource ="{Binding MyObjects}" 
    SelectedItem="{Binding SelectedObject}"
    AutoGenerateColumns="False"
    CanUserResizeColumns="True"  
    ClipboardCopyMode="ExcludeHeader" 
    CanUserResizeRows="False"
    CanUserSortColumns="False"     
    SelectionMode="Extended"
    EnableRowVirtualization="False">

    ...

</custom:MyDataGrid>

我做错了什么?这是我第一次尝试创建自定义控件。

2 个答案:

答案 0 :(得分:0)

在资源字典中,您应该为自定义控件提供default template但是您没有提供任何内容,而且您希望在默认样式上提供上下文菜单,因此您可以做的就是将您的样式基于dataGrid,这样就可以了那是inherits template of dataGrid -

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:YourNamespace">

    <Style TargetType="{x:Type local:MyDataGrid}"
           BasedOn="{StaticResource {x:Type DataGrid}}">
        <Setter Property="ContextMenu">
            <Setter.Value>
                <ContextMenu>
                    ...
                </ContextMenu>
            </Setter.Value>
        </Setter>
    </Style>    
</ResourceDictionary>

答案 1 :(得分:0)

如果您覆盖默认样式,则必须为Custom DataGrid指定控件模板

以太松散这一行:

  DefaultStyleKeyProperty.OverrideMetadata(typeof(MyDataGrid), new FrameworkPropertyMetadata(typeof(MyDataGrid)));

或指定ControlTemplate。

1)在Expression Blend Like so

中编辑DataGrid的副本

2)Or copy paste it from here