2009-04-28 8 views
14

Sto utilizzando un datagrid WPF dal progetto Microsoft CodePlex. Ho un controllo personalizzato che voglio database in un campo dalla riga del datagrid. Non posso per la vita di me capire come specificare un suggerimento su una riga datagrid.Come specificare una descrizione per un controllo in uno stile da XAML?

Il più vicino possibile è utilizzare un RowStyle con un setter per impostare il suggerimento, ma sembra funzionare solo per il testo. Quando provo a inserire ControlTempalte come valore per la descrizione, viene visualizzato il risultato della chiamata a ToString sul tipo ControlTemplate.

Penso di aver bisogno di impostare il "Modello" di proprietà della descrizione comandi, ma io non riesco a capire come fare ...

<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 - a dir poco fastidioso. Passato oltre 15-20 minuti con questo problema di un parassita ... mi piacerebbe sapere perché questo è così .. – Gishu

risposta

25

capito ... mi ha portato circa 6 ore ...

Per qualche ragione, non riesco a impostare il valore direttamente utilizzando Value.Setter. Se definisco il contenuto del suggerimento come una risorsa statica, e poi lo imposto nella proprietà Style di DataGrid.RowStyle, funziona.

Così, lo stile fila datagrid assomiglia:

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

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

     </dg:DataGrid.RowStyle> 

e la risorsa è

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

Grazie!

+0

Grazie, mi hai aiutato molto :) – ScorpiAS

0

Non c'è bisogno per il ControlTemplate. Se si desidera che il StackPanel nel ToolTip, basta impostarlo come:

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

Lo penseresti, ma questo non funziona. Rende l'eccezione: Impossibile aggiungere contenuto di tipo 'System.Windows.Controls.StackPanel' a un oggetto di tipo 'System.Object'. Errore nell'oggetto 'System.Windows.Controls.StackPanel' nel file di markup 'NewsCluesWpf; component/processdictionary.xaml' Riga 31 Posizione 31. –

+0

In realtà, per me funziona correttamente, senza errori ('WPF',' .NET4. 0 '). Grazie mille, Kent! – Fedor

0
Non

sicuro che si può farlo attraverso XAML.

Un modo più semplice potrebbe essere gestire semplicemente l'evento LoadingRow. In XAML avere qualcosa di simile:

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

Poi nel codice dietro

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

Ovviamente si dovrà modificare il codice a seconda di come si popolano i dati nel datagrid. Questo è anche testato =)

6

La chiave è quella di utilizzare il ToolTipService.ToolTip proprietà, invece di descrizione comandi - come questo:

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

Ha lavorato per me senza problemi. +1 – heltonbiker

0

avevo bisogno di impostare il tooltip dinamicamente in base al contenuto della cella. Sto usando il suggerimento per visualizzare il testo di overflow del testo dalla cella. L'associazione sottostante proviene da una proprietà di classe C# denominata CellText. Grazie ai post precedenti per avermi permesso di evitare di capire da solo l'intera faccenda.

<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

Anche questo ha funzionato con un paio di modifiche; incluso nel caso in cui aiuti qualcuno.

Il mio Datadrid è associato a un elenco di oggetti personalizzati, volevo visualizzare la stringa "Nome" come colonna e la stringa "testo" nel suggerimento. Il trucco per me (newbe) era che dovevo includere la colonna di testo e nasconderla affinché venisse visualizzata nel suggerimento, ad es.:

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