Wpf 模板绑定到父级';s本身绑定到XPath的内容-内容不显示

Wpf 模板绑定到父级';s本身绑定到XPath的内容-内容不显示,wpf,xaml,data-binding,styles,Wpf,Xaml,Data Binding,Styles,我有一个ItemsControl,它的ItemsSource绑定到XML数据提供程序。代码如下所示 <ItemsControl Grid.Row="1" Margin="30" ItemsSource="{Binding Source={StaticResource VideosXML}, XPath=TutorialVideo}" > <ItemsControl.ItemsPanel> <Ite

我有一个ItemsControl,它的ItemsSource绑定到XML数据提供程序。代码如下所示

<ItemsControl Grid.Row="1" Margin="30"
              ItemsSource="{Binding Source={StaticResource VideosXML}, 
              XPath=TutorialVideo}" >
  <ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
      <WrapPanel/>
    </ItemsPanelTemplate>
  </ItemsControl.ItemsPanel>
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <Button Style="{StaticResource StyleMetroVideoButton}" 
              Content="{Binding XPath=@Name}"
              ToolTip="{Binding XPath=Description}"/>
    </DataTemplate>
  </ItemsControl.ItemTemplate>                        
</ItemsControl>

VideosXML是引用外部XML文件的XML数据提供程序。正如您所看到的,Name属性应用于按钮的内容,xml文件中的Description元素应用于按钮的工具提示。下面是按钮样式的代码。它基本上是一个文本块,上面有一个褪色的“播放”按钮

<Style TargetType="{x:Type Button}" x:Key="StyleMetroVideoButton">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Grid Name="PlayGrid" Background="#FF323236">
                        <TextBlock TextWrapping="Wrap" Text="{TemplateBinding Content}" VerticalAlignment="Top" HorizontalAlignment="Center"/>
                        <Image Name="Play" Source="{StaticResource BtnVideoPlayHoverPNG}"  Opacity="0.0" Stretch="None"/>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Opacity" Value="0.6" TargetName="Play"/>
                            <Setter Property="Background" Value="#8D8D94" TargetName="PlayGrid"/>
                        </Trigger>
                        <Trigger Property="IsPressed" Value="True">
                            <Setter Property="Source" Value="{StaticResource BtnVideoPlayClickPNG}" TargetName="Play"/>
                            <Setter Property="Opacity" Value="0.6" TargetName="Play"/>
                            <Setter Property="Background" Value="#8D8D94" TargetName="PlayGrid"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="False">
                            <Setter Property="Opacity" Value="0.0" TargetName="Play"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="Width" Value="90" />
        <Setter Property="Height" Value="80" />
        <Setter Property="Margin" Value="5,5,5,5"/>
    </Style>

您可以从样式中看到TextBlock中的“文本”绑定到按钮本身的内容:Text=“{TemplateBinding content}”,并且从第一段代码中可以看到按钮的内容通过XPath绑定到XML元素。但是,根本不显示任何文本。如果我硬编码按钮中的某些内容,如Content=“A button”将显示,则该功能会起作用。此外,工具提示工作正常,因此我知道它从XML文件读取数据。那么,是什么让绑定到XPath与硬编码不同呢

提前感谢您查看我的问题

编辑:示例XML

<?xml version="1.0" encoding="utf-8" ?>
<Videos xmlns="">
  <TutorialVideo Name="Video 1">
    <Description>A video to watch</Description>
    <Filepath>video1.wmv</Filepath>
  </TutorialVideo>
</Videos>

要看的视频
视频1.wmv

好的,我发现了问题,出于某种原因,
Content
属性正在传递整个xml元素,将内容绑定设置为
Content=“{binding XPath=@Name,Path=Value}”
应该可以解决这个问题

谷歌会知道,这可能有一个合乎逻辑的解释

<ItemsControl Grid.Row="1" Margin="30"
              ItemsSource="{Binding Source={StaticResource VideosXML}, 
              XPath=TutorialVideo}" >
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Button Style="{StaticResource StyleMetroVideoButton}"  
                            Content="{Binding XPath=@Name, Path=Value}"  
                            ToolTip="{Binding XPath=Description}"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>


如果将
TextBlock
替换为
ContentPresenter
(只是猜测一下)如果发布一个小的xml示例,我可以看一看。添加ContentPresenter时似乎没有任何变化。我提供了一些示例xml。谢谢如果您在TextBlock
Text=“{Binding XPath=@Name}”
上使用此选项,它会起作用,因此传递的内容似乎是整个xml元素,我会继续查找哦,好的,谢谢!嗯,它在工作;但是,显示的内容是按钮本身的内容。我可以从样式中删除整个TextBlock,它仍然会显示,因为内容没有传递到TextBlock的文本。我之所以需要它,是因为TextBlock可以包装文本,按钮不能。更新答案,似乎如果您将绑定路径设置为Value,它工作正常,我认为它与ContentPresenter有关,但不知道您想要xml元素的字符串值。很好!我感谢你的帮助。我不想吹毛求疵,但现在按钮内容和文本块文本都显示并重叠。也许我对这个想法的理解是错误的???。我把TextBlock作为按钮内容,这很有效;然而,这并没有让我感觉到它不再流行了。。。抱歉,我仍在学习xaml及其工作原理。