Silverlight模板控件集ItemTemplate

时间:2014-04-08 11:02:21

标签: c# silverlight datatemplate

我正在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>

1 个答案:

答案 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的帮助,你提出的建议是正确的,只是阻止它的代码的另一部分。