ItemsControl 是一种数据展示控件,大致分为三个部分组成:Template, ItemTemplate, ItemsPanel.
所以重写ItemsControl必须要重新定义这三个部分,例如:
<local:CustomCardView Margin="10"
x:Name="cardView"
Width="400"
ItemsSource="{Binding TestDtos}">
<local:CustomCardView.Template>
<ControlTemplate TargetType="local:CustomCardView">
<ScrollViewer ScrollViewer.HorizontalScrollBarVisibility="Disabled"
ScrollViewer.VerticalScrollBarVisibility="Auto">
<ItemsPresenter />
</ScrollViewer>
</ControlTemplate>
</local:CustomCardView.Template>
<local:CustomCardView.ItemsPanel>
<ItemsPanelTemplate>
<telerik:VirtualizingWrapPanel Margin="0,5,0,5"
ItemHeight="100"
ItemWidth="100" />
</ItemsPanelTemplate>
</local:CustomCardView.ItemsPanel>
<local:CustomCardView.ItemTemplate>
<DataTemplate>
<Grid Background="AliceBlue"
Width="100"
Height="100">
<TextBlock Text="{Binding Name}" />
</Grid>
</DataTemplate>
</local:CustomCardView.ItemTemplate>
</local:CustomCardView>
这里CustomCardView继承ItemControl, 必须重写IsItemItsOwnContainerOverride和GetContainerForItemOverride方法,如下:
public class CustomCardView : ItemsControl
{
public static readonly DependencyProperty ViewItemContextMenuProperty = DependencyProperty.Register(
"ViewItemContextMenu",
typeof(TelerikControl.RadContextMenu),
typeof(CustomCardView),
new PropertyMetadata(OnViewItemContextMenuChanged));
public CustomCardView()
{
DefaultStyleKey = typeof(CustomCardView);
}
public TelerikControl.RadContextMenu ViewItemContextMenu
{
get { return (TelerikControl.RadContextMenu)GetValue(ViewItemContextMenuProperty); }
set { SetValue(ViewItemContextMenuProperty, value); }
}
protected override bool IsItemItsOwnContainerOverride(object item)
{
return false;
}
protected override DependencyObject GetContainerForItemOverride()
{
var container = new CardViewItem();
//container.MouseRightButtonUp += new MouseButtonEventHandler(container_MouseRightButtonUp);
return container;
}
private FrameworkElement _itemWithContextMenu = null;
private void container_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
ViewItemContextMenu.IsOpen = true;
}
private static void OnViewItemContextMenuChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
CustomCardView control = (CustomCardView)d;
if (e.NewValue != null)
{
TelerikControl.RadContextMenu contextMenu = (TelerikControl.RadContextMenu)e.NewValue;
TelerikControl.RadContextMenu.SetContextMenu(control, (TelerikControl.RadContextMenu)e.NewValue);
contextMenu.Loaded += new RoutedEventHandler(contextMenu_Loaded);
}
}
private static void contextMenu_Loaded(object sender, RoutedEventArgs e)
{
TelerikControl.RadContextMenu menu = (TelerikControl.RadContextMenu)sender;
CardViewItem item = menu.GetClickedElement<CardViewItem>();
}
}
在GetContainerForItemOverride方法中要得到ItemControl的Item的Container,这里我们需要自定义一个CardViewItem,继承ContentControl。
另外,借鉴如下网址:
http://www.cnblogs.com/xiaokang088/archive/2011/04/15/2016719.html
源代码下载地址:http://download.youkuaiyun.com/detail/tianyu0910/4084598