2010-10-22 1 views

Répondre

30

dans votre DataGrid, abonnez-vous pour l'événement AutoGeneratingColumn, l'événement args (DataGridAutoGeneratingColumnEventArgs) a le nom de la colonne et un « Cancel », si le nom de la colonne est ID puis définissez Cancel = true. devrait faire l'affaire.

+0

Ça marcherait ...Bien que cela va immédiatement à l'encontre du modèle MVVM ... mais fonctionnera sans aucun doute. –

+4

Merci, cela fonctionnera bien. Dans ce cas, je ne m'intéresse pas trop à MVVM car le DataGrid fait partie d'un UserControl personnalisé et je n'ai aucun problème à utiliser le code-behind si c'est quelque chose qui n'affecte que la vue. – Rachel

+0

@Aaron, si vous comptez sur la vue pour générer le MV, alors je pense que vous allez trouver qu'il n'est pas adhérent à MVVM :) –

1

Je ne peux pas parler pour 4, mais ce n'était pas possible dans 3.5 SP1, au moins sans enregistrement pour un événement que je voulais éviter à tout prix.

Qu'est-ce que vous pourriez faire à la place est de changer le code de génération à AutoGenerateColumns=False puis il suffit de placer les colonnes que vous aimez dans le XAML que les données sous-jacentes seront tous placés toujours dans les colonnes de façon appropriée

  <dg:DataGridTextColumn Header="Display" Binding="{Binding DisplayName}"/> 
      <dg:DataGridTextColumn Header="Host" Binding="{Binding HostName}"/> 
      <dg:DataGridTextColumn Header="Database" Binding="{Binding Database}"/> 
      <dg:DataGridTextColumn Header="Username" Binding="{Binding Username}"/> 
      <dg:DataGridTextColumn Header="Password" Binding="{Binding Password}"/> 

Cela permettra Vous pouvez afficher les seules colonnes qui vous intéressent par rapport au modèle sous-jacent, et modifier le Header pour l'afficher comme bon vous semble. Vous n'êtes donc pas lié au nom Property sur le modèle.

+0

Ce n'est pas une option pour moi puisque je ne connais pas les noms de colonnes préalablement – Rachel

+0

C'est ne pas être généré à partir d'un modèle? À quoi ressemblent les données ...? –

+0

Le modèle contient uniquement une propriété DataTable qui contient les données à afficher dans le DataGrid. – Rachel

0

Je ne dirais pas qu'il est excellente solution ... mais ... vous pouvez avoir une couche supplémentaire d'abstraction par exemple, disons que vous avez un objet comme:

public class Foo 
{ 
    public string Id { get; set; } 

    public string Property2 { get; set; } 

    public string Property3 { set; get; } 
} 

Vous ne voulez pas la colonne pour Id, donc vous créez un nouvel objet

public class Foo2 
{ 
    public string Property2 { get; set; } 

    public string Property3 { set; get; } 
} 

puis mappez/convertissez Foo en Foo2 et vous avez terminé.

Une autre façon possible (pas toujours possible) est de changer modificateur d'accès à interne

public class Foo 
{ 
    internal string Id { get; set; } 

    public string Property2 { get; set; } 

    public string Property3 { set; get; } 
} 

cette façon, vous n'avez pas la colonne Id généré soit.

2

Autre possibilité serait Visibility.Collapsed:

private void dataGrid_AutoGeneratingColumn(object sender, 
     DataGridAutoGeneratingColumnEventArgs e) 
    { 
     //Set properties on the columns during auto-generation 
     switch (e.Column.Header.ToString()) 
     { 
      case "rownameYouWantToHide": 
       e.Column.Visibility = Visibility.Collapsed; 
       break; 
     } 
    } 
6

Vous pouvez utiliser un comportement (code réutilisable) pour faire le travail ... De cette façon, vous pouvez utiliser l'attribut qui centraliserait la visibilité de la colonne en un seul endroit.

Utilisation:

<Window 
... 
xmlns:extension="clr-namespace:WpfControlLibrary.Extension;assembly=WpfControlLibrary"> 

<DataGrid ... 
    extension:DataGridBehavior.UseBrowsableAttributeOnColumn="True"> 

...

public class YourObjectItem 
{ 
    [Browsable(false)] 
     public Assembly Assembly { get; set; } 

code:

using System; 
using System.ComponentModel; 
using System.Windows; 
using System.Windows.Controls; 

namespace WpfControlLibrary.Extension 
{ 
    public static class DataGridBehavior 
    { 
     public static readonly DependencyProperty UseBrowsableAttributeOnColumnProperty = 
      DependencyProperty.RegisterAttached("UseBrowsableAttributeOnColumn", 
      typeof(bool), 
      typeof(DataGridBehavior), 
      new UIPropertyMetadata(false, UseBrowsableAttributeOnColumnChanged)); 

     public static bool GetUseBrowsableAttributeOnColumn(DependencyObject obj) 
     { 
      return (bool)obj.GetValue(UseBrowsableAttributeOnColumnProperty); 
     } 

     public static void SetUseBrowsableAttributeOnColumn(DependencyObject obj, bool val) 
     { 
      obj.SetValue(UseBrowsableAttributeOnColumnProperty, val); 
     } 

     private static void UseBrowsableAttributeOnColumnChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
     { 
      var dataGrid = obj as DataGrid; 
      if (dataGrid != null) 
      { 
       if ((bool) e.NewValue) 
       { 
        dataGrid.AutoGeneratingColumn += DataGridOnAutoGeneratingColumn; 
       } 
       else 
       { 
        dataGrid.AutoGeneratingColumn -= DataGridOnAutoGeneratingColumn; 
       } 
      } 
     } 

     private static void DataGridOnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
     { 
      var propDesc = e.PropertyDescriptor as PropertyDescriptor; 

      if (propDesc != null) 
      { 
       foreach(Attribute att in propDesc.Attributes) 
       { 
        var browsableAttribute = att as BrowsableAttribute; 
        if (browsableAttribute != null) 
        { 
         if (! browsableAttribute.Browsable) 
         { 
          e.Cancel = true; 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+0

C'est exactement ce que je cherchais! Testé et fonctionnant sur .NET 4.6.1 :) – JoanComasFdz

+0

Merci! C'est sympa de savoir que ça marche toujours bien :)! –

+0

Le DataGrid devrait fonctionner de cette façon hors de la boîte à mon humble avis et ramasser l'en-tête du DisplayNameAttriibute aussi! – StuartQ

Questions connexes