【问题标题】:How to add a button outside datatemplate in itemscontrol如何在项目控件中的数据模板外部添加按钮
【发布时间】:2015-08-05 09:25:19
【问题描述】:

我创建了一个 WPF 应用程序。其中我有一个如下的数据模板

 <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>

是否有可能在新的 itemscontrol 中重用数据模板?

【问题讨论】:

  • 您想在另一个 DataTemplate 中使用 DataTemplate?
  • 据我所知,您不能重复使用模板,您必须将代码粘贴进去。
  • @Glen 编辑了问题
  • @glen 是的,如果可能的话

标签: wpf xaml datatemplate itemscontrol itemtemplate


【解决方案1】:

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

【讨论】:

  • @Bahman_Aries。这很奇怪。它应该工作。您是否尝试过绑定内容属性? Content="{Binding}"
  • @Liero:我的错,你是对的,在ContentControls 中添加Content="{Binding}" 是这个解决方案起作用的关键。
【解决方案2】:

通过阅读 this answer 以及 cmets 中提到的 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>

【讨论】:

  • 怎么样:&lt;Button Content="{Binding}" ContentTemplate="{StaticResource ItemTemplate}" /&gt;?第二个 StackPanel 和第二个 ContentPresenter 是多余的
  • @Liero: ContentButtonContentPresenter。所以你的代码基本上和我的一样,它可以正常工作。 ps,它们不是多余的,这种结构是 OP 要求的。
  • 结果是一样的,但是现在你在 ContentPresenter 里面有了 ContentPresenter,因为 Button 在它的模板中包含了 ContentPresenter。这就像在 ContentControl 中添加 ContentPresenter,因为 Button 实际上是 ContentControl。
  • @Liero,您对Button 的看法是正确的,它是多余的。我将根据您的评论修改我的答案。第二个StackPanel 也是不必要的。但既然 OP 用了一个,那我就放在那里吧。
  • 我也应该更正我之前的评论:&lt;Button Content=... /&gt; 中的Content 实际上是ContentControlButton
【解决方案3】:

您可以创建一个 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>

【讨论】:

  • 既然可以在 ContentPresenter 中实例化数据模板,为什么还要创建用户控件?
  • 我觉得说“你需要来创建一个UserControl”有点过分了。
  • 同意。我已经改了。
猜你喜欢
  • 2010-12-24
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多