Шаблонирование элементов ItemControl без использования ItemsSource - PullRequest
1 голос
/ 26 сентября 2011

Я пытаюсь создать собственный Silverlight ItemsControl. Я хочу, чтобы пользователи этого элемента управления добавляли элементы с использованием XAML. Предметами будут другие элементы пользовательского интерфейса. Я хотел бы добавить поле вокруг всех добавленных элементов, и поэтому я хочу добавить ItemTemplate.

Я пытаюсь сделать это с помощью ItemsControl.ItemTemplate, но, похоже, он не используется при привязке к элементам в XAML, т.е. с использованием свойства ItemsControl.Items. Однако, если я использую свойство ItemsControl.ItemsSource, используется ItemTemplate.

Можно ли в любом случае использовать ItemTemplate, хотя я не назначаю ItemsSource?

Это мой код

<ItemsControl x:Class="MyControl">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate >
            <toolkit:WrapPanel/>            
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

    <ItemsControl.ItemTemplate>
        <DataTemplate>           
            <StackPanel Margin="20" Background="Red">
                <TextBlock Text="Test text"/>
                <ContentPresenter Content="{Binding}"/>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>        


    <ItemsControl.Template>
        <ControlTemplate>
            <Border>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>

                    <ItemsPresenter x:Name="ItemsPresenter"/>

                    <Button Command="{Binding SearchCommand}"/>
                </Grid>
             </Border>
        </ControlTemplate>
    </ItemsControl.Template>
</ItemsControl>

И когда я использую свой контроль

<MyControl>
    <Button Content="Button"/>
    <Button Content="Button"/>
</MyControl>

Это дало мне отображение элементов с макетом панели переноса, но без примененного шаблона данных. Затем я нашел этот пост , в котором упоминалось два метода переопределения.

Сын в моем коде позади класса, который у меня сейчас

protected override bool IsItemItsOwnContainerOverride(object item)
{
    return false;
}

protected override void PrepareContainerForItemOverride(DependencyObject element,  
        object item)
{
    base.PrepareContainerForItemOverride(element, item);
    ((ContentPresenter)element).ContentTemplate = ItemTemplate;
}

НО - это дает мне два элемента со стилем (например, красным текстовым блоком), но без реального содержимого. Кнопки в списке не добавляются. Такое ощущение, что я делаю что-то не так - есть какие-нибудь указатели на что?

Спасибо!

1 Ответ

1 голос
/ 27 сентября 2011

Если все, что вы хотите сделать, это добавить поле, то вы можете просто установить ItemContainerStyle вместо указания шаблона:

<ItemsControl>
    <ItemsControl.ItemContainerStyle>
        <Style>
            <Setter Property="FrameworkElement.Margin" Value="10" /> <!-- or whatever margin you want -->
        </Style>
    </ItemsControl.ItemContainerStyle>
</ItemsControl>

Это позволит вам установить любое свойство элемента управления контейнера (которое в случае ItemsControl будет ContentControl) через стиль.

...