我正在尝试构建自定义Silverlight ItemsControl。我希望此控件的用户使用XAML添加项目。这些项目将是其他UI元素。我想在所有添加的项目周围添加一个边距,因此我想添加一个ItemTemplate。
我试图使用ItemsControl.ItemTemplate来做这件事,但是在绑定到XAML中的元素时似乎没有使用它,即使用ItemsControl.Items属性。 但是,如果我使用ItemsControl.ItemsSource属性,则使用ItemTemplate。
即使我没有分配ItemsSource,还是使用ItemTemplate吗?
这是我目前的代码
<ItemsControl x:Class="MyControl">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate >
<toolkit:WrapPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Margin="20" Background="Red">
<TextBlock Text="Test text"/>
<ContentPresenter Content="{Binding}"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.Template>
<ControlTemplate>
<Border>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ItemsPresenter x:Name="ItemsPresenter"/>
<Button Command="{Binding SearchCommand}"/>
</Grid>
</Border>
</ControlTemplate>
</ItemsControl.Template>
</ItemsControl>
当我使用我的控件时
<MyControl>
<Button Content="Button"/>
<Button Content="Button"/>
</MyControl>
这让我看到了项目的显示,带有换行面板布局但没有应用数据模板。 然后我发现this post提到了两种要覆盖的方法。
儿子在我现在的班级代码隐藏中
protected override bool IsItemItsOwnContainerOverride(object item)
{
return false;
}
protected override void PrepareContainerForItemOverride(DependencyObject element,
object item)
{
base.PrepareContainerForItemOverride(element, item);
((ContentPresenter)element).ContentTemplate = ItemTemplate;
}
但是 - 这给了我两个项目,风格(I.E是红色文本块)但没有实际内容。列表中的按钮未添加。感觉我做错了什么 - 关于什么的任何指针?
谢谢!
答案 0 :(得分:1)
如果你只想添加一些余量,那么你可以设置ItemContainerStyle
而不是指定模板:
<ItemsControl>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="FrameworkElement.Margin" Value="10" /> <!-- or whatever margin you want -->
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
这将允许您通过样式设置容器控件的任何属性(在ItemsControl
的情况下将是ContentControl
)。