这是代码。它所做的就是,它在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控件,但其所有项目的字符都被视为单独的项目,因为您可以看到@图片。为什么?
[ 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;
}
}
答案 0 :(得分:1)
这是正确的,因为您声明要为每个项目实例化一个列表框。由于项目正在暴露字符串(因此是一个字符数组),因此列表框会正确显示每行的一个字符。
为什么要在另一个ItemsControl中插入ItemsControl(列表框)?
干杯
答案 1 :(得分:1)
因为您将数据源提供为字符串..它将该字符串转换为集合(字符数组),因为itemssource属性将始终是集合..
如果你仍然想在单个项目的数据模板中创建一个列表框(在你的情况下它是标题)..然后尝试这个..
将title属性更改为List,并在创建标题时创建包含一个字符串的列表。所以项目源将是列表,因为itemssource包含一个字符串,它将只创建一个项目。