Элементы не отображаются с ItemsPanelTemplate
Я просто пытаюсь понять концепцию ItemsPanelTemplate. Для этого я создал небольшой пример решения.
У меня есть UserControl "MyListView" со следующим кодом.
MyListView.xaml:
<UserControl x:Class="WpfApplication2.MyListView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<UserControl.Resources>
<Style TargetType="ListViewItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListViewItem">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Border BorderBrush="Black" BorderThickness="1" Margin="0" Padding="0" Width="100" Background="Gray">
<TextBlock Text="Text" HorizontalAlignment="Center" />
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<ListView ItemsSource="{Binding Path=TreeItemChildren}">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch">
</StackPanel>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
</UserControl>
В MyListView.cs я добавил DependencyProperty для привязки данных, которые должны отображаться:
public partial class MyListView : UserControl
{
public MyListView()
{
this.TreeItemChildren = new ObservableCollection<string>();
this.TreeItemChildren.Add("Text0");
this.TreeItemChildren.Add("Text1");
this.TreeItemChildren.Add("Text2");
InitializeComponent();
}
public ObservableCollection<string> TreeItemChildren
{
get { return (ObservableCollection<string>)GetValue(TreeItemChildrenProperty); }
set { SetValue(TreeItemChildrenProperty, value); }
}
// Using a DependencyProperty as the backing store for TreeItemChildren. This enables animation, styling, binding, etc...
public static readonly DependencyProperty TreeItemChildrenProperty =
DependencyProperty.Register("TreeItemChildren", typeof(ObservableCollection<string>), typeof(MainWindow), new UIPropertyMetadata(null));
}
Когда я сейчас пытаюсь использовать этот UserControl в моем главном окне, данные для отображения отсутствуют. В чем причина этого?
1 ответ
Вы не связали ни одного ListBoxItem
свойства в шаблоне управления, Content
не отображается по этой причине.
Обычно вы бы заменить это:
<TextBlock Text="Text" HorizontalAlignment="Center" />
с:
<ContentPresenter HorizontalAlignment="Center"/>
(Если шаблонный элемент управления ContentControl
ContentPresenter
привязывается к Content
связанные свойства автоматически)
Так же ListView.ItemsSource
привязывается к собственности на DataContext
(который не установлен и не должен быть установлен, поскольку он мешает привязкам на экземплярах элемента управления), измените его так, чтобы он как-то предназначался для UserControl
(например, использовать ElementName
или же RelativeSource
).
(Должны быть ошибки привязки, вызванные ItemsSource
обязательна, научись их отлаживать)