2010-11-03 25 views
12

No estoy seguro de lo que está haciendo aquí, pero el enlace funciona para la etiqueta en la plantilla de datos pero no en la información sobre herramientas. Cualquier ayuda será apreciada.WPF Enlace a la información sobre herramientas

    <DataTemplate DataType="Label"> 
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Left"> 
         <StackPanel.ToolTip> 
          <ToolTip DataContext="{Binding Path=PlacementTarget, 
     RelativeSource={x:Static RelativeSource.Self}}"> 
           <TextBlock Text="{Binding Path=DataContext.Description}" /> 
          </ToolTip> 
         </StackPanel.ToolTip> 
         <Image Source="{StaticResource ApplicationInfoS}" 
           Margin="0 0 5 0" Stretch="None" 
           HorizontalAlignment="Left" /> 
         <Label Style="{StaticResource lblTextContent}" 
           Padding="5 0 0 0" 
           Content="{Binding Path=DataContext.Description, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}}"/> 
        </StackPanel> 
       </DataTemplate> 

BTW the DataTemplate se utiliza en Listview. La propiedad "Descripción" existe en el modelo de vista vinculado a la vista de lista.

El mensaje que recibo en la ventana de salida en VS2010 es:

System.Windows.Data de error: error de ruta BindingExpression:: 39 'Descripción' propiedad no se encuentra en 'objeto' '' Cadena'(= HashCode -466763399) '. BindingExpression: Path = DataContext.Description; DataItem = 'StackPanel' (Nombre = ''); el elemento de destino es 'TextBlock' (Name = ''); propiedad de destino es 'Texto' (tipo 'cadena')

ACTUALIZACIÓN

he renunciado por ahora. El uso de este truco, por el momento:

añadir una etiqueta a la StackPanel y Bind "Descripción" para que

<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Tag="{Binding Path=DataContext.Description, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}}"> 

Enlazar la información sobre herramientas para la etiqueta. Sí, un truco, pero funciona.

<StackPanel.ToolTip> 
    <ToolTip DataContext="{Binding Path=PlacementTarget, RelativeSource={x:Static RelativeSource.Self}}"> 
    <TextBlock Text="{Binding Path=Tag}" /> 
    </ToolTip> 
</StackPanel.ToolTip> 

Saludos

Mike

Respuesta

5

Información sobre la herramienta no debe necesitar una unión RelativeSource. Prueba este contexto sin el enlace de datos

<StackPanel.ToolTip> 
    <ToolTip Content={Binding Description} /> 
<StackPanel.ToolTip> 

Esto es suponiendo que el tipo de etiqueta que esta DataTemplate se basa en una propiedad llamada tiene descripción. Uno de los pocos casos en los que puede necesitar vincularse al PlacementTarget es en algunos casos con un control ContextMenu.

+0

La descripción proviene del ViewModel asociado a esta vista. – ozczecho

+0

¿La plantilla de datos está basada en el modelo de vista? o alguna otra clase – TerrorAustralis

0

Si este DataTemplate es el ItemTemplate para un ListView como usted indica, entonces no debería necesitar establecer el DataContext en la información sobre herramientas ni tener un RelativeSource BindingExpression en su enlace Label.Content. DataView ya debe ser configurado por ListView. Es por eso que usamos DataTemplate.

Intentar apenas un habitual vinculante para cada uno:

<DataTemplate> 
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Left"> 
     <StackPanel.ToolTip> 
      <ToolTip> 
       <TextBlock Text="{Binding Path=Description}" /> 
      </ToolTip> 
     </StackPanel.ToolTip> 
     <Image Source="{StaticResource ApplicationInfoS}" 
       Margin="0,0,5,0" 
       Stretch="None" 
       HorizontalAlignment="Left" /> 
     <Label Style="{StaticResource lblTextContent}" 
       Padding="5,0,0,0" 
       Content="{Binding Path=Description}" /> 
    </StackPanel> 
</DataTemplate> 
+0

No, no es el DataTemplate para ItemTemplate. Es una plantilla de datos para una columna en una vista de lista. DataTemplate se define como un estilo en un recurso. – ozczecho

1

También tuve problemas con los enlaces en la descripción, ya que la información sobre herramientas se definió como un recurso. Resolví el problema creando un controlador de eventos para el evento ToolTipOpening. En la función del manejador, puede acceder al DataContext del elemento UI mostrado y establecer el DataContext de la información sobre herramientas.

Esta fue mi XAML:

<StackPanel ToolTip=" " ToolTipOpening="Item_ToolTipOpening" > 

y esto fue mi controlador de código:

void Item_ToolTipOpening(object sender, ToolTipEventArgs e) 
    { 
     if (sender as FrameworkElement == null) 
      return; 
     ToolTip tooltip = (ToolTip) FindResource("MailItemToolTip"); 
     if ((sender as FrameworkElement).DataContext is LinkItem) 
      tooltip.DataContext = ((sender as FrameworkElement).DataContext as LinkItem).ParentItem as MailItem; 
     else if ((sender as FrameworkElement).DataContext is AttachmentItem) 
      tooltip.DataContext = ((sender as FrameworkElement).DataContext as AttachmentItem).ParentItem as MailItem; 
     (sender as FrameworkElement).ToolTip = tooltip; 
    } 

Tenga en cuenta que la información sobre herramientas tiene que ser establecido (al menos hasta cierto valor), de lo contrario el caso ToolTipOpening no es llamado.

2

Tooltip es una ventana emergente.Algunas veces necesita mostrarse al costado de los límites de su ventana principal. Así que la información sobre herramientas no puede estar en su árbol visual principal. Si observa su jerarquía de árbol visual, verá que la ventana emergente tiene su propia raíz de árbol visual. Es por eso que Tooltip no conoce el DataContext del elemento de lista automáticamente. Ahora la pregunta es cómo propagar el DataContext al árbol visual de la información sobre herramientas. La forma en que demostró en su ACTUALIZACIÓN es una forma de hacerlo ...

Cuestiones relacionadas