我想创建一个自定义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>
我做错了什么?这是我第一次尝试创建自定义控件。
答案 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的副本