2009-04-28 6 views
14

J'utilise la grille de données WPF du projet Microsoft CodePlex. J'ai un contrôle personnalisé que je veux connecter à un champ de la ligne de la grille de données. Je ne peux pas pour la vie de moi comprendre comment spécifier une info-bulle sur une ligne DataGrid.Comment spécifier une info-bulle pour un contrôle dans un style à partir de XAML?

Le plus proche que je suis venu est d'utiliser un RowStyle avec un Setter pour définir l'info-bulle, mais cela ne semble fonctionner que pour le texte. Lorsque j'essaie de placer un ControlTempalte en tant que valeur pour l'info-bulle, il affiche le résultat de l'appel de ToString sur le type ControlTemplate.

Je pense que je dois définir le « modèle » propriété de l'info-bulle, mais je ne peux pas à comprendre comment faire ...

<dg:DataGrid Name="dgResults" AutoGenerateColumns="True"> 

      <dg:DataGrid.RowStyle > 


      <Style TargetType="{x:Type dg:DataGridRow}"> 

       <Setter Property="ToolTip" > 
        <Setter.Value> 

         <ControlTemplate TargetType="{x:Type ToolTip}"> 
          <StackPanel> 
           <TextBlock>txt1</TextBlock><TextBlock>txt2</TextBlock> 
          </StackPanel> 
         </ControlTemplate> 


        </Setter.Value> 
       </Setter> 
      </Style> 

     </dg:DataGrid.RowStyle> 

    </dg:DataGrid> 
+0

@Sean - ennuyeux pour dire le moins. J'ai passé plus de 15-20 minutes avec ce ravageur d'un problème ... J'aimerais savoir pourquoi c'est comme ça .. – Gishu

Répondre

25

figured it out ... m'a pris environ 6 heures ...

Pour une raison quelconque, je ne peux pas définir la valeur directement à l'aide Value.Setter. Si je définis le contenu de l'info-bulle en tant que ressource statique, puis que vous le définissez dans la propriété Style du DataGrid.RowStyle, cela fonctionne.

Ainsi, le style de la ligne DataGrid ressemble:

  <Style TargetType="{x:Type dg:DataGridRow}"> 

       <Setter Property="ToolTip" Value="{StaticResource resKWIC}"> 
       </Setter>     
      </Style> 

     </dg:DataGrid.RowStyle> 

Et la ressource est

<Window.Resources> 
    <StackPanel x:Key="resKWIC"> 
     <TextBlock>f1</TextBlock> 
     <TextBlock>f2></TextBlock> 
    </StackPanel> 
</Window.Resources> 

Merci!

+0

Merci, vous m'avez beaucoup aidé :) – ScorpiAS

0

Il n'y a pas besoin pour le ControlTemplate. Si vous voulez que le StackPanel dans le ToolTip, situé juste comme:

<Setter Property="ToolTip"> 
    <Setter.Value> 
     <StackPanel> 
      <TextBlock>txt1</TextBlock><TextBlock>txt2</TextBlock> 
     </StackPanel> 
    </Setter.Value> 
</Setter> 
+10

On pourrait le penser, mais cela ne fonctionne pas. Donne l'exception: Impossible d'ajouter un contenu de type 'System.Windows.Controls.StackPanel' à un objet de type 'System.Object'. Erreur à l'objet 'System.Windows.Controls.StackPanel' dans le fichier de balisage 'NewsCluesWpf; component/processdictionary.xaml' Ligne 31 Position 31. –

+0

En fait, cela fonctionne très bien pour moi, pas d'erreurs ('WPF',' .NET4. 0'). Merci beaucoup, Kent! – Fedor

0

Vous ne savez pas que vous pouvez le faire via XAML.

Un moyen plus simple pourrait être de gérer simplement l'événement LoadingRow. En XAML quelque chose comme:

<dg:DataGrid Name="dgResults" AutoGenerateColumns="True" 
      LoadingRow="dgResults_LoadingRow" 
      ItemsSource="{Binding ListOfStrings}" /> 

Puis dans le code derrière

void dgResults_LoadingRow(object sender, DataGridRowEventArgs e) 
{ 
    DataGridRow row = e.Row; 
    row.ToolTip = row.DataContext as string; 
} 

Évidemment, vous devrez modifier le code en fonction de la façon dont vous peuplez les données dans la grille de données. Ceci est également non testé =)

6

La clé est d'utiliser la propriété ToolTipService.ToolTip, au lieu de infobulle - comme ceci:

<Setter Property="ToolTipService.ToolTip" Value="My Tooltip"/> 
+0

A travaillé pour moi sans faire d'histoires. +1 – heltonbiker

0

je devais définir l'infobulle dynamiquement en fonction du contenu des cellules. J'utilise l'info-bulle pour afficher le texte de débordement de texte de la cellule. La liaison ci-dessous provient d'une propriété de classe C# nommée CellText. Merci aux messages ci-dessus pour m'avoir permis d'éviter de comprendre tout le problème moi-même.

<DataGridTextColumn Header="HeaderText" Binding="{Binding DisplayText, Mode=OneWay}" Width="33*"> 
          <DataGridTextColumn.CellStyle> 
           <Style> 
            <Setter Property="ToolTipService.ToolTip" Value="{Binding DisplayText, Mode=OneWay}"/> 
           </Style> 
          </DataGridTextColumn.CellStyle> 
         </DataGridTextColumn> 
1

J'ai également obtenu ce travail avec quelques changements; inclus au cas où cela aiderait quelqu'un.

Mon Datadrid est lié à une liste d'objets personnalisés, je voulais afficher la chaîne "Nom" en tant que colonne et la chaîne "texte" dans l'info-bulle. L'astuce pour moi (newbe) était que je devais inclure la colonne de texte et la cacher pour qu'elle apparaisse dans l'info-bulle, c'est-à-dire:

<DataGrid AutoGenerateColumns="False" CanUserAddRows="False" EnableRowVirtualization="False" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" IsReadOnly="True" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding}" Name="dgrTextGroupText" VerticalContentAlignment="Stretch" Grid.Column="3" Grid.Row="1" Grid.RowSpan="6" CanUserReorderColumns="False" CanUserSortColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Name}" Width="*" /> 
     <DataGridTextColumn Binding="{Binding Text}" Width="0" Visibility="Hidden" /> 
    </DataGrid.Columns> 
    <DataGrid.RowStyle> 
     <Style TargetType="{x:Type DataGridRow}"> 
      <Style.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=DataContext.text}" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </DataGrid.RowStyle> 
</DataGrid> 
Questions connexes