2009-04-28 17 views
14

Estoy usando la cuadrícula de datos WPF del proyecto Microsoft CodePlex. Tengo un control personalizado que deseo enlazar con un campo desde la fila de la cuadrícula de datos. No puedo entender cómo especificar una información sobre herramientas en una fila de cuadrícula de datos.¿Cómo especificar una información sobre herramientas para un control en un estilo de XAML?

Lo más parecido que he encontrado es utilizar un RowStyle con un Setter para configurar la información sobre herramientas, pero parece que esto solo funciona para el texto. Cuando trato de poner un ControlTempalte como el valor de la información sobre herramientas, muestra el resultado de llamar a ToString en el tipo ControlTemplate.

creo que es necesario para establecer la propiedad "plantilla" de la información sobre herramientas, pero me parece que no puede encontrar la manera de hacer eso ...

<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 - molesto para decir lo menos. Pasé más de 15-20 minutos con esta plaga de un problema ... Me encantaría saber por qué esta es la forma en que es ... – Gishu

Respuesta

25

lo descubrió ... me llevó alrededor de 6 horas ...

Por alguna razón, no puedo establecer el valor directamente usando Value.Setter. Sin embargo, si defino el contenido de la información sobre herramientas como un recurso estático y luego lo configuro en la propiedad Style de DataGrid.RowStyle, funciona.

Por lo tanto, el estilo fila cuadrícula de datos se parece a:

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

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

     </dg:DataGrid.RowStyle> 

y el recurso es

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

Gracias!

+0

Gracias, me ayudaste mucho :) – ScorpiAS

0

No hay necesidad de que el ControlTemplate. Si desea que el StackPanel en el ToolTip, acaba de establecer como:

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

Lo pensaría, pero esto no funciona. Da excepción: No se puede agregar el contenido del tipo 'System.Windows.Controls.StackPanel' a un objeto de tipo 'System.Object'. Error en el objeto 'System.Windows.Controls.StackPanel' en el archivo de marcado 'NewsCluesWpf; component/processdictionary.xaml' Línea 31 Posición 31. –

+0

En realidad, funciona bien para mí, no hay errores ('WPF',' .NET4. 0'). Muchas gracias, Kent! – Fedor

0
No

asegurarse de que puede hacerlo a través de XAML.

Una manera más fácil podría ser simplemente manejar el evento LoadingRow. En xaml tener algo como:

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

Luego, en código detrás

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

Obviamente, tendrá que cambiar el código dependiendo de cómo se está completando los datos en la cuadrícula de datos. Esto también es probada =)

6

La clave es usar la ToolTipService.ToolTip propiedad, en lugar de información sobre herramientas - como esto:

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

Trabajó para mí sin problemas. +1 – heltonbiker

0

que necesitaba para ajustar dinámicamente la información sobre herramientas basadas en el contenido celular. Estoy usando la información sobre herramientas para mostrar texto de desbordamiento de texto de la celda. El enlace siguiente es de una propiedad de clase c llamada CellText. Gracias a las publicaciones anteriores por permitirme evitar descubrir todo yo mismo.

<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

También conseguí esto trabajando con un par de cambios; incluido en caso de que ayude a alguien.

Mi Datadrid está vinculada a una lista de objetos personalizados, quería mostrar la cadena "Nombre" como columna y la cadena "texto" en la información sobre herramientas. El truco para mí (newbe) fue que tuve que incluir la columna de texto y ocultarla para que aparezca en la información sobre herramientas, es decir:

<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> 
Cuestiones relacionadas