Silverlight模板控件集ItemTemplate

本文关键字:ItemTemplate 控件 Silverlight | 更新日期: 2023-09-27 17:57:26

我正在Silverlight中构建一个包含列表框的控件,目前我有一个列表框和一个标题文本。我想做的是公开/设置列表框的项模板,这样当我将新控件添加到用户控件时,我可以使用以下内容。

我尝试将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>

Silverlight模板控件集ItemTemplate

这是导致问题的ItemContainerStyle。

我有一种可以拖动列表中项目的样式:

最初我的风格是这样的:

<Style x:Key="DraggableListBoxItem" 
       TargetType="telerik:RadListBoxItem" >
    <Setter Property="telerik:DragDropManager.AllowCapturedDrag" Value="True" />
</Style>

当我使用Telerik控件的隐式样式时,我错过了一个关键位BasedOn。如果没有这个,样式将永远不会使用项目模板。

<Style x:Key="DraggableListBoxItem" 
       TargetType="telerik:RadListBoxItem" 
       BasedOn="{StaticResource RadListBoxItemStyle}">
    <Setter Property="telerik:DragDropManager.AllowCapturedDrag" Value="True" />
</Style>

感谢Martin的帮助,你建议的是正确的,只是阻止它的代码的另一部分。