我正在Silverlight中构建一个包含列表框的控件,目前我有一个列表框和一个标题文本。我正在尝试做的是公开/设置列表框的项目模板,所以当我将新控件添加到我的usercontrol时,我可以使用以下内容。
我尝试将DataTemplate设置为依赖属性,但没有设置任何内容。我知道目前它看起来很简单,但我想扩展它,但在尝试扩展控件之前需要这个基本元素。
由于
大卫。
xaml中的预期用法:
<UserControls:NewListControl>
<UserControls:NewListControl.Items>
<UserControls:MultiSelectItem StringCode="100" Description="GS" />
<UserControls:MultiSelectItem StringCode="200" Description="GC" />
<UserControls:MultiSelectItem StringCode="200" Description="GC" />
<UserControls:MultiSelectItem StringCode="200" Description="GC" />
<UserControls:MultiSelectItem StringCode="200" Description="GC" />
</UserControls:NewListControl.Items>
<UserControls:NewListControl.ItemTemplate>
<DataTemplate>
<Grid>
<TextBox Text="{Binding StringCode}" />
</Grid>
</DataTemplate>
</UserControls:NewListControl.ItemTemplate>
</UserControls:NewListControl>
控件的代码:
public class NewListControl : Control
{
public NewListControl()
{
this.DefaultStyleKey = typeof(NewListControl);
}
public DataTemplate ItemTemplate
{
get
{
return (DataTemplate)GetValue(ItemTemplateProperty);
}
set
{
SetValue(ItemTemplateProperty, value);
}
}
public static readonly DependencyProperty ItemTemplateProperty =
DependencyProperty.Register("ItemTemplate",
typeof(DataTemplate), typeof(NewListControl), null);
}
控件的默认样式和模板:
<Style TargetType="local:NewListControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:NewListControl">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<Grid>
<TextBlock
Name="TitleTextBlock"
Grid.Row="0" FontSize="20"
Text="{Binding Title, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
Visibility="{Binding TitleVisible, ElementName=userControl}"/>
<telerik:RadListBox
x:Name="GroupList"
Grid.Row="1" AllowDrop="True"
ItemContainerStyle="{StaticResource DraggableListBoxItem}"
ItemTemplate="{TemplateBinding ItemTemplate}"
BorderThickness="0"
ItemsSource="{Binding Items, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}">
<telerik:RadListBox.DragDropBehavior>
<Behavior:RestrictedListBoxDragDropBehavior />
</telerik:RadListBox.DragDropBehavior>
<telerik:RadListBox.DragVisualProvider>
<telerik:ScreenshotDragVisualProvider />
</telerik:RadListBox.DragVisualProvider>
</telerik:RadListBox>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
答案 0 :(得分:0)
原来是导致问题的ItemContainerStyle。
我有一种样式,允许列表中的项目可拖动:
最初我的风格设置如下:
<Style x:Key="DraggableListBoxItem"
TargetType="telerik:RadListBoxItem" >
<Setter Property="telerik:DragDropManager.AllowCapturedDrag" Value="True" />
</Style>
当我使用Telerik Controls的隐式样式时,我错过了一个关键位BasedOn。除此之外,风格永远不会使用项目模板。
<Style x:Key="DraggableListBoxItem"
TargetType="telerik:RadListBoxItem"
BasedOn="{StaticResource RadListBoxItemStyle}">
<Setter Property="telerik:DragDropManager.AllowCapturedDrag" Value="True" />
</Style>
感谢Martin的帮助,你提出的建议是正确的,只是阻止它的代码的另一部分。