Elemente werden nicht mit itemsPaneltemplate angezeigt
-
28-10-2019 - |
Frage
Ich versuche nur, das Konzept der ItemsPaneltemplate zu verstehen. Dazu habe ich eine kleine Probenlösung gebaut.
Ich habe ein UserControl "myListView" mit dem folgenden Code.
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>
In myListView.cs fügte ich eine DependentyProperty hinzu, um die Daten daran zu binden, die angezeigt werden sollten:
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));
}
Wenn ich jetzt versuche, dieses UserControl in meinem Hauptwindow zu verwenden, müssen keine Daten angezeigt werden. Was ist der Grund dafür?
Lösung
Du hast nicht gebunden irgendein ListBoxItem
Eigenschaften in der Kontrollvorlage, die Content
wird aus diesem Grund nicht angezeigt.
Normalerweise würden Sie dies ersetzen:
<TextBlock Text="Text" HorizontalAlignment="Center" />
mit:
<ContentPresenter HorizontalAlignment="Center"/>
(Wenn die Vorlagenkontrolle a ist ContentControl
das ContentPresenter
bindet an das Content
Verwandte Eigenschaften automatisch)
Auch die ListView.ItemsSource
bindet an eine Eigenschaft auf der DataContext
(was nicht gesetzt ist und sollte nicht eingestellt werden Da es die Bindungen für die Instanzen der Kontrolle beeinträchtigt) ändern Sie sie auf irgendwie zielen auf die UserControl
(zB Verwendung ElementName
oder RelativeSource
).
(Es sollte Bindungsfehler geben, die durch die verursacht werden ItemsSource
Bindung, lernen wie man sie debuggiert)