2010-10-20 7 views
1

Est-il possible de masquer une colonne donnée en fonction d'une liaison. J'ai essayé de définir la propriété de visibilité sur DataGridTextColumn (en utilisant le convertisseur correct), mais cela ne semble pas fonctionner. Si je règle la valeur directement (pas par liaison) cela fonctionne. Est-ce que la visibilité des colonnes est une opération tout ou rien avec le DataGrid?WPF Datagrid - Définit la visibilité de la colonne par ligne

Répondre

6

Tout ce que vous avez à faire est d'ajouter:

puis utilisé ce qui suit dans vos colonnes:

<DataGridTextColumn CellStyle="{StaticResource vStyle}"/> 
+0

Bonne réflexion :) –

3

Jetez un oeil à ce poste, le problème est expliqué
Binding in a WPF data grid text column
et ici
http://blogs.msdn.com/b/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx

Citant JaredPar du premier lien
« Essentiellement, le problème est que le DataGridTextColumn n'a pas de parent dont hériter d'une liaison car elle ne fait pas partie de l'arbre logique ou visuel.Vous devez configurer un contexte d'héritage pour avoir accès aux informations de liaison "

Solution pour obtenir ce travail ..

public class DataGridContextHelper 
{ 
    static DataGridContextHelper() 
    { 
     DependencyProperty dp = FrameworkElement.DataContextProperty.AddOwner(typeof(DataGridColumn)); 
     FrameworkElement.DataContextProperty.OverrideMetadata(typeof(DataGrid), 
     new FrameworkPropertyMetadata 
      (null, FrameworkPropertyMetadataOptions.Inherits, 
      new PropertyChangedCallback(OnDataContextChanged))); 
    } 

    public static void OnDataContextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     DataGrid grid = d as DataGrid; 
     if (grid != null) 
     { 
      foreach (DataGridColumn col in grid.Columns) 
      { 
       col.SetValue(FrameworkElement.DataContextProperty, e.NewValue); 
      } 
     } 
    } 
} 

public partial class App : Application 
{ 
    static DataGridContextHelper dc = new DataGridContextHelper(); 
} 

<DataGrid x:Name="c_dataGrid" AutoGenerateColumns="False" DataContext="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=SelectedItem}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Visibility="{Binding Path=(FrameworkElement.DataContext), RelativeSource={x:Static RelativeSource.Self}, Converter={StaticResource HideColumnAConverter}}" /> 
    </DataGrid.Columns> 
</DataGrid> 

object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    if (value == null) 
    { 
     return Visibility.Visible; 
    } 
    // Whatever you're binding against 
    TestClass testClass = value as TestClass; 
    return testClass.ColumnAVisibility; 
} 
+0

Cela fonctionne pour toute la colonne ... ce que je cherche, c'est un contrôle de rangée individuel. Par exemple, la ligne 1 a 5 colonnes et la ligne 2 a 4 colonnes parce que l'une d'elles est cachée. – AKoran

+0

Mis à jour mon exemple, j'espère que cela va le faire :) Ajouté DataContext = "{Liative RelativeSource = {x: Source Relative Statique.Self}, Path = SelectedItem}" pour le DataGrid et un convertisseur pour chaque colonne. –

+0

Ou peut-être un meilleur moyen de le faire sans le convertisseur si vous liez une propriété de visibilité.

Questions connexes