Элементы не отображаются с ItemsPanelTemplate - PullRequest
0 голосов
/ 13 января 2012

Я просто пытаюсь понять концепцию 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 в моем MainWindow, данные для отображения отсутствуют. В чем причина?

1 Ответ

0 голосов
/ 13 января 2012

У вас нет привязанных каких-либо ListBoxItem свойств в шаблоне элемента управления, по этой причине Content не отображается.

Обычно вы должны заменить это:

<TextBlock Text="Text" HorizontalAlignment="Center"  />

с:

<ContentPresenter HorizontalAlignment="Center"/>

(Если шаблонным элементом управления является ContentControl, ContentPresenter автоматически связывается с Content связанными свойствами)

Также ListView.ItemsSource связывается со свойством DataContext (которое не установлено, и не должно быть установлено , поскольку оно мешает привязкам на экземплярах управление), измените его на каким-либо образом нацельтесь на UserControl (например, используйте ElementName или RelativeSource).

(Должны быть ошибки привязки, вызванные привязкой ItemsSource, узнайте , как их отлаживать )

...