Как добавить кнопку вне таблицы данных в itemscontrol

Я создал приложение WPF, в котором у меня есть Datatemplate, как показано ниже.

 <DataTemplate x:Key="ItemTemplate">
    <StackPanel>
        <TextBlock Text="item"/>
        <TextBlock Text="{Binding Number}"/>
    </StackPanel>
 </DataTemplate>

У меня есть такой ItemsControl

 <ItemsControl ItemsSource="{Binding Items}"
                      Grid.Column="1"
                      Grid.Row="3"
                      ItemTemplate="{StaticResource ItemTemplateWithButton}" />

где мне нужен такой шаблон элемента

    <DataTemplate x:Key="ItemTemplateWithButton">
        <StackPanel>
            <StackPanel>
                <TextBlock Text="item"/>
                <TextBlock Text="{Binding Number}"/>
            </StackPanel>
            <StackPanel>
                <Button>
                    <StackPanel>
                        <TextBlock Text="item"/>
                        <TextBlock Text="{Binding Number}"/>
                    </StackPanel>
                </Button>
            </StackPanel>
        </StackPanel>
    </DataTemplate>

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


person Alias Varghese    schedule 05.08.2015    source источник
comment
Вы хотите использовать DataTemplate внутри другого DataTemplate?   -  person Glen Thomas    schedule 05.08.2015
comment
Насколько мне известно, вы не можете повторно использовать шаблон, вам придется вставить свой код.   -  person Mike Eason    schedule 05.08.2015
comment
@Glen отредактировал вопрос   -  person Alias Varghese    schedule 05.08.2015
comment
@glen да, если это возможно   -  person Alias Varghese    schedule 05.08.2015


Ответы (3)


Вы тоже можете использовать ContentControl

<DataTemplate x:Key="ItemTemplate">
    <StackPanel>
        <TextBlock Text="item"/>
        <TextBlock Text="{Binding Number}"/>
    </StackPanel>
</DataTemplate>
<DataTemplate x:Key="ItemTemplateWithButton">
    <StackPanel>
        <ContentControl ContentTemplate="{StaticResource ItemTemplate}" />
        <Button>
            <ContentControl ContentTemplate="{StaticResource ItemTemplate}" />
        </Button>
    </StackPanel>
</DataTemplate>
person Nacho    schedule 05.08.2015
comment
@Bahman_Aries. Это странно. Он должен работать. Вы пробовали привязать свойство содержимого? Content="{Binding}" - person Liero; 05.08.2015
comment
@Liero: Моя ошибка, вы правы, добавление Content="{Binding}" в оба ContentControls является ключом к работе этого решения. - person Bahman_Aries; 05.08.2015

Что я понимаю, читая этот ответ и что Liero, упомянутый в комментариях, можно ли повторно использовать DataTemplate, используя либо ContentPresenter, либо ContentControl. Тем не мение:

  1. ContentPresenter более легкий.
  2. ContentPresenter предназначен для использования внутри шаблонов элементов управления.
  3. ContnetPresenter предназначен для использования как есть, а ContentControl предназначен для расширения (унаследован от).

В результате вот решение, основанное на том, о чем вы просили:

    <DataTemplate x:Key="ItemTemplate">
        <StackPanel>
            <TextBlock Text="item"/>
            <TextBlock Text="{Binding Number}"/>
        </StackPanel>
    </DataTemplate>

    <DataTemplate x:Key="ItemTemplateWithButton">
        <StackPanel>
            <ContentPresenter ContentTemplate="{StaticResource ItemTemplate}"/>
            <StackPanel>
                <Button Content="{Binding}" ContentTemplate="{StaticResource ItemTemplate}" />
            </StackPanel>
        </StackPanel>
    </DataTemplate>
person Bahman_Aries    schedule 05.08.2015
comment
А как насчет: <Button Content="{Binding}" ContentTemplate="{StaticResource ItemTemplate}" />? Второй StackPanel и второй ContentPresenter избыточны - person Liero; 05.08.2015
comment
@Liero: Content - это ContentPresenter из Button. Итак, ваш код в основном такой же, как мой, и он будет работать нормально. ps, они не являются избыточными, эта структура - это то, что просил OP. - person Bahman_Aries; 05.08.2015
comment
Результат тот же, но теперь у вас есть ContentPresenter внутри ContentPresenter, поскольку Button содержит ContentPresenter в своем шаблоне. Это похоже на добавление ContentPresenter в ContentControl, потому что Button фактически является ContentControl. - person Liero; 05.08.2015
comment
@Liero, Вы правы насчет Button, это лишнее. Я изменю свой ответ на основе вашего комментария. Второй StackPanel тоже не нужен. Но так как OP использовал один, я оставлю его там. - person Bahman_Aries; 05.08.2015
comment
Я также должен исправить свой предыдущий комментарий: Content в <Button Content=... /> на самом деле ContentControl из Button. - person Bahman_Aries; 05.08.2015

Вы можете создать UserControl для хранения xaml, который хотите повторно использовать:

<UserControl x:Class="StackOverflow.SharedControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <StackPanel>
            <TextBlock Text="item">
            </TextBlock>
            <TextBlock Text="{Binding Number}"></TextBlock>
        </StackPanel>
    </Grid>
</UserControl>

Затем используйте этот UserControl в обоих шаблонах.

<DataTemplate x:Key="ItemTemplate">
    <controls:SharedControl/>
</DataTemplate>

<DataTemplate x:Key="ItemTemplateWithButton">
    <StackPanel>
        <controls:SharedControl/>
        <StackPanel>
            <Button>
                <StackPanel>
                    <TextBlock Text="item">
                    </TextBlock>
                    <TextBlock Text="{Binding Number}"></TextBlock>
                </StackPanel>
            </Button>
        </StackPanel>
    </StackPanel>
</DataTemplate>
person Glen Thomas    schedule 05.08.2015
comment
Зачем создавать usercontrol, если вы можете создать экземпляр datatemplate внутри ContentPresenter? - person Liero; 05.08.2015
comment
Я думаю, это слишком сильно, чтобы сказать, что вам нужно создать UserControl. - person Rhys; 05.08.2015
comment
Согласованный. Я изменил это. - person Glen Thomas; 05.08.2015