0

ItemsSource が XML データ プロバイダーにバインドされている ItemsControl があります。コードは次のようになります。

<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}"。コードの最初の部分から、ボタンのコンテンツは XML にバインドされます。 XPath 経由の要素。ただし、テキストはまったく表示されません。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>
4

1 に答える 1

1

OK、問題が見つかりました。何らかの理由でContentプロパティが xml 要素全体を渡しているため、コンテンツ バインディングを に設定Content="{Binding XPath=@Name, Path=Value}"すると問題が解決するはずです

これにはおそらく論理的な説明があり、Googleは知っているでしょう

<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>
于 2012-12-17T04:47:54.707 に答える