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?

War es hilfreich?

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)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top