如何在项目控件中的数据模板外添加按钮

How to add a button outside datatemplate in itemscontrol

我创建了一个 WPF app.In,我有一个 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>

是否有可能在新的项目控件中重用数据模板?

您可以创建一个 UserControl 来保存要重复使用的 xaml:

<UserControl x:Class="Whosebug.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>

我通过阅读评论中提到的 this answer and what Liero 了解到,可以通过使用 ContentPresenterContentControl 来重用 DataTemplate。然而:

  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>

您也可以使用 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>