我创建了一个自定义控件,我使用以下代码插入到我的窗口中
<controls:ListExpander Text="Class Diagrams"></controls:ListExpander>
有问题的控件包含几个子控件,其中包括一个列表。如何创建设置,以便指定应添加到列表中的项目?最终我正在寻找以下架构
<controls:ListExpander Text="Class Diagrams">
<SomeItem>data<SomeItem>
<SomeItem>data<SomeItem>
<SomeItem>data<SomeItem>
<SomeItem>data<SomeItem>
</controls:ListExpander>
在这种情况下,应将SomeItem对象添加到ListExpander中的列表中:
<ListBox Name="lstItems" Background="LightGray">
<ListBox.Items>
// Items should go here
</ListBox.Items>
</ListBox>
我是WPF的新手,但我想这就是在ListExpander上创建一个依赖于SomeItem
类型的对象的依赖集合?
编辑:让我澄清一下。我只是希望能够为控件提供一些参数,它可以转换为控件中包含的列表框中的项目。
答案 0 :(得分:1)
您是否为ListExpander创建了课程?您可以非常简单地继承ItemsControl的所有功能。这是我为您创建的示例类,用于对其进行建模。
<强>类强>
using System.Windows.Controls;
namespace ListExpanderSample
{
public class ListExpander : ItemsControl
{
static ListExpander()
{
/* Required logic goes here */
}
}
}
<强>实施强>
<Grid>
<Grid.Resources>
<Style x:Key="{x:Type local:ListExpander}" TargetType="{x:Type local:ListExpander}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:ListExpander}">
<Border Background="Transparent" >
<ScrollViewer Focusable="False" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
<ItemsPresenter />
</ScrollViewer>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Grid.Resources>
<local:ListExpander>
<local:ListExpander.Items>
<Button Content="Button 1"/>
<TextBox Text="TextBox 1"/>
<Button Content="Button 2"/>
<TextBox Text="TextBox 2"/>
</local:ListExpander.Items>
</local:ListExpander>
</Grid>
<强> SCREENSHOT 强>
我希望这能帮到你,Qua。
答案 1 :(得分:1)
我认为你的控件不仅包含你想要添加的这些孩子,对吧?所以我会向你的控件类添加一个属性,如下所示:
private ObservableCollection<UIElement> _items = new ObservableCollection<UIElement>();
public ObservableCollection<UIElement> Items
{
get { return this._items; }
}
然后在您的控件模板中,您只需将列表框绑定到此集合
<ListBox Name="lstItems" Background="LightGray" ItemsSource="{Binding Items}">
</ListBox>
这样你就可以像这样使用它:
<controls:ListExpander Text="Class Diagrams">
<controls:ListExpander.Items>
<SomeItem>data<SomeItem>
<SomeItem>data<SomeItem>
<SomeItem>data<SomeItem>
<SomeItem>data<SomeItem>
</controls:ListExpander.Items>
</controls:ListExpander>
能够在<controls:ListExpander.Items>
使用[ContentProperty("Items")]
属性装饰您的课程时使用它。
答案 2 :(得分:0)
有一种简单的方法可以做到这一点。将类型为ItemCollection的属性添加到控件类中,如下所示:
public ItemCollection Items{
get{
return innerItems.Items;
}set{
innerItems.Items.Clear();
foreach (var item in value){
innerItems.Items.Add(item);
}
}
}
其中innerItems只是XAML中的ItemsControl(如下所示):
<UserControl x:Class="TestApp.ItemsExtender"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300" Width="300">
<StackPanel>
<Label Content="Control Label" />
<ItemsControl x:Name="innerItems" />
</StackPanel>
</UserControl>
然后向控件类添加一个属性,如下所示:
[ContentProperty("Items")]
public partial class ItemsExtender : UserControl
{...}
这将告诉XAML应该将默认项目分配给Items属性,并且Items属性将使用它们来填充内部列表集合。然后您可以像这样使用它:
<this:ItemsExtender>
<Label Content="item1" />
<Label Content="item2" />
<Label Content="item3" />
</this:ItemsExtender>
您可以使用类型转换器扩展此示例,以支持向集合和依赖项属性添加任意内容以支持绑定,但这应该可以帮助您入门。
希望它有所帮助!