时间:2011-07-21 11:51:42

标签: wpf

这是代码。它所做的就是,它在StackPanel中创建一个新的ListBox控件,并为其添加一个新的Item。该问题在页面底部描述。

MyWindow.xaml

<Window.Resources>
    <DataTemplate x:Key="itemsTemplate">
        <Border Width="200" Height="50" >
            <ListBox ItemsSource="{Binding Title}" />
        </Border>
    </DataTemplate>
</Window.Resources>

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="100"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>

    <ItemsControl Grid.Column="1"
                  Grid.Row="0"
                  ItemsSource="{Binding ElementName=mainWindow, Path=DataItems}"
                  ItemTemplate="{StaticResource itemsTemplate}">
        <ItemsControl.Template>
            <ControlTemplate>
                <ScrollViewer HorizontalScrollBarVisibility="Auto">
                    <ItemsPresenter />
                </ScrollViewer>
            </ControlTemplate>
        </ItemsControl.Template>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>
</Grid>

MyWindow.xaml.cs

    private ObservableCollection<MyDataItem> dataItems;

    public ObservableCollection<MyDataItem> DataItems
    {
        get { return dataItems; }
    }

    public Window1()
    {
        dataItems = new ObservableCollection<MyDataItem>();
        InitializeComponent();
    }

MyDataItem.cs

public class MyDataItem : DependencyObject
{
    public string Title
    {
        get
        {
            return (string)GetValue(TitleProperty);
        }
        set
        {
            SetValue(TitleProperty, value);
        }
    }

    public static readonly DependencyProperty TitleProperty =
        DependencyProperty.Register("Title", typeof(string), 
                                    typeof(MyDataItem), new UIPropertyMetadata(""));

    public MyDataItem(string title)
    {
        Title = title;
    }
}

使用项

添加新的列表框
    void addNewItem_Click(object sender, RoutedEventArgs e)
    {
        MyDataItem item = new MyDataItem("12");
        dataItems.Add(item);
        e.Handled = true;
    }

在该动作之后,我看到了新的ListBox控件,但其所有项目的字符都被视为单独的项目,因为您可以看到@图片。为什么?

the result

  

[ EDIT ]

解决了,我不得不在该类的任何地方从字符串更改为List:

public class MyDataItem : DependencyObject
{
    public List<string> Title
    {
        get
        {
            return (List<string>)GetValue(TitleProperty);
        }
        set
        {
            SetValue(TitleProperty, value);
        }
    }

    public static readonly DependencyProperty TitleProperty =
        DependencyProperty.Register("Title", typeof(string), 
                                    typeof(MyDataItem), 
                                    new UIPropertyMetadata(new List<string>()));

    public MyDataItem(List<string> title)
    {
        Title = title;
    }
}

2 个答案:

答案 0 :(得分:1)

这是正确的,因为您声明要为每个项目实例化一个列表框。由于项目正在暴露字符串(因此是一个字符数组),因此列表框会正确显示每行的一个字符。

为什么要在另一个ItemsControl中插入ItemsControl(列表框)?

干杯

答案 1 :(得分:1)

因为您将数据源提供为字符串..它将该字符串转换为集合(字符数组),因为itemssource属性将始终是集合..

如果你仍然想在单个项目的数据模板中创建一个列表框(在你的情况下它是标题)..然后尝试这个..

将title属性更改为List,并在创建标题时创建包含一个字符串的列表。所以项目源将是列表,因为itemssource包含一个字符串,它将只创建一个项目。