2011-11-09 2 views
0

En raison de la nature de notre logiciel, nous devons créer nos colonnes DataGrid dynamiquement dans le code derrière et l'ajouter ensuite à la DataGrid comme ceci:Comment lier le contenu d'une info-bulle à une propriété MVVM dans le code?

DataGridBoundColumn dataGridBoundColumn = new DataGridTextColumn 
                  { 
                   CellStyle = ...,                    
                   Header = header, 
                   Binding = binding 
                  }; 
reportDataGrid.Columns.Add(dataGridBoundColumn); 

Maintenant, nous avons besoin d'une info-bulle sur le columnheader:

ToolTipService.SetToolTip(dataGridBoundColumn, "ENTER VALUE"); 

Eh bien cela fonctionne bien aussi. Cependant, j'ai besoin de lier la valeur de l'info-bulle à une propriété sur le ViewModel. Je sais comment faire cela dans le xaml, mais je ne sais pas comment le faire dans le code.

Toute aide serait appréciée,

MISE À JOUR:

Merci à la réponse de Steve, j'ai pu résoudre ce problème un peu différemment:

Binding bindingBoundToTooltipProperty = new Binding() 
            { 
             Source = reportDataGrid.DataContext, 
             Path = new PropertyPath("ToolTipSorting") 
            }; 


BindingOperations.SetBinding(dataGridBoundColumn, ToolTipService.ToolTipProperty, bindingBoundToTooltipProperty); 

si le DataGridColumnHeaderStyle a été personnalisé, assurez-vous pour ajouter ces lignes au modèle aussi:

<Trigger Property="IsMouseOver" Value="True"> 
    <Setter Property="ToolTip" Value="{Binding Column.(ToolTipService.ToolTip), RelativeSource={RelativeSource Self}}"/> 
</Trigger> 

Répondre

3

Vous devriez être en mesure de mettre en place une reliure comme ci-dessous:

BindingOperations.SetBinding(dataGridBoundColumn, 
    ToolTipService.ToolTipProperty, 
    new Binding("Path.To.My.Property")); 

Note: le DataContext de ce sera la valeur de la propriété Header sur la colonne

Vous voulez lier à une propriété sur le modèle de vue; en supposant que votre modèle de vue est le DataContext pour le DataGrid vous voulez changer la liaison à quelque chose comme:

new Binding("DataContext.ToolTipSorting") 
{ 
    RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor) 
    { 
     AncestorType = typeof(DataGrid) 
    } 
} 

Cette tente de localiser le premier objet parent de type DataGrid et saisir la valeur de sa propriété DataContext.ToolTipSorting.

+0

Merci Steve. Je reçois System.Windows.Data Erreur: 2: Impossible de trouver la gouvernance FrameworkElement ou FrameworkContentElement pour l'élément cible. BindingExpression: Path = ToolTipSorting; DataItem = null; l'élément cible est 'DataGridTextColumn' (HashCode = 42996073); La propriété target est 'ToolTip' (type 'Object') – Houman

+0

Si le Datacontext se trouve dans l'en-tête, comment puis-je me lier à la propriété MVT "ToolTipSorting" sur mon ViewModel? – Houman

+0

Je ne suis pas sûr à 100% que 'DataContext' sera la propriété' Header' - pouvez-vous laisser le chemin de liaison vierge pour voir quel type de contexte de données est dans votre exemple? –

Questions connexes