2010-11-26 6 views
0

J'ai des problèmes de liaison de données dans un DataTemplate. Dans le ControlTemplate ci-dessous, la zone de texte de la Grille fonctionne et imprime la valeur correcte. Mais le TextBlock dans le DataTemplate HyperlinkButtons ne fonctionne pas. Bien que le HyperlinkButtons NavigateUri est lié correctement. Quelqu'un pourrait-il m'aider avec cetteProblèmes de liaison dans DataTemplate

J'ai créé un exemple simple qui illustre mon problème.

MainPage.xaml

<UserControl x:Class="SilverlightApplication8.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    d:DesignHeight="300" d:DesignWidth="400"> 

    <UserControl.Resources> 
     <ControlTemplate x:Key="EventControlTemplate" TargetType="Button"> 
      <Grid> 
       <!--WORKS--> 
       <!--<Grid > 
        <TextBlock x:Name="TitleTextBlock" Text="{Binding Title}" Foreground="Red" FontWeight="Bold" /> 
       </Grid>--> 

       <!--DOES NOT WORK--> 
       <HyperlinkButton TargetName="_blank" NavigateUri="{Binding Url}"         > 
        <HyperlinkButton.ContentTemplate> 
         <DataTemplate> 
          <Grid> 
           <TextBlock Foreground="Green" Text="{Binding Title}"/> 
          </Grid> 
         </DataTemplate> 
        </HyperlinkButton.ContentTemplate> 
       </HyperlinkButton> 
      </Grid> 
     </ControlTemplate> 
    </UserControl.Resources> 

    <Grid x:Name="LayoutRoot" Background="White"> 

     <ItemsControl x:Name="Links" Foreground="White" > 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <Border > 
         <Button Template="{StaticResource EventControlTemplate}" Click="Button_Click"/> 
        </Border> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 

    </Grid> 
</UserControl> 

MainPage.xaml.cs

using System.Collections.Generic; 
using System.Windows; 
using System.Windows.Controls; 

namespace SilverlightApplication8 
{ 
    public partial class MainPage : UserControl 
    { 
     public MainPage() 
     { 
      InitializeComponent(); 

      List<Events> events = new List<Events>(); 
      events.Add(new Events(){Title = "This is title 1", Url = "http://www.thesun.co.uk"}); 
      events.Add(new Events(){Title = "This is title 2", Url = "http://www.thesun.co.uk"}); 
      events.Add(new Events() { Title = "This is title 3", Url = "http://www.thesun.co.uk" }); 

      Links.ItemsSource = events; 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 

     } 
    } 

    public class Events 
    { 
     public string Url { get; set; } 
     public string Title { get; set; } 
    } 
} 
+0

Bienvenue à SO, s'il vous plaît prendre quelques minutes pour lire la FAQ et la documentation Markdown (un synopsis utile est disponible dans la marge de droite lors de la modification d'une question). – AnthonyWJones

Répondre

1

vous réglez la ContentTemplate, la DataContext dont sera le Content du HyperlinkButton. Puisque vous n'avez pas défini le Content, vous tentez de lier null.

Cela devrait fonctionner:

<HyperlinkButton TargetName="_blank" NavigateUri="{Binding Url}" Content="{Binding Title}"> 
    <HyperlinkButton.ContentTemplate> 
     <DataTemplate> 
      <Grid> 
       <TextBlock Foreground="Green" Text="{Binding .}"/> 
      </Grid> 
     </DataTemplate> 
    </HyperlinkButton.ContentTemplate> 
</HyperlinkButton> 

Mais qui pose la question de savoir pourquoi vous configurez même le ContentTemplate au lieu de simplement faire ceci:

<HyperlinkButton TargetName="_blank" NavigateUri="{Binding Url}" Content="{Binding Title}"/> 
+0

J'ai simplifié l'exemple. Mais j'ai plusieurs liaisons à l'intérieur de la grille. – reachify

+0

Mais je viens de modifier Content = "{Binding}" et à l'intérieur du DataTemplate je pourrais ajouter beaucoup de blocs de texte dans la grille :) Incroyable. Merci beaucoup!!! – reachify

Questions connexes