允许在xaml中向列表中添加元素

时间:2009-09-29 14:04:09

标签: c# .net wpf xaml

我创建了一个自定义控件,我使用以下代码插入到我的窗口中

<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类型的对象的依赖集合?

编辑:让我澄清一下。我只是希望能够为控件提供一些参数,它可以转换为控件中包含的列表框中的项目。

3 个答案:

答案 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

Sample ListExpander http://lh4.ggpht.com/_jvamiP47SsA/SsWM6xN_3BI/AAAAAAAAAkg/tZUWxzi9wVI/s800/Window1.jpg

我希望这能帮到你,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>

您可以使用类型转换器扩展此示例,以支持向集合和依赖项属性添加任意内容以支持绑定,但这应该可以帮助您入门。

希望它有所帮助!