2010-10-22 10 views

risposta

30

nel vostro datagrid, sottoscrivere l'evento AutoGeneratingColumn, l'evento args (DataGridAutoGeneratingColumnEventArgs) ha il nome di colonna e un "Cancel", se il nome di colonna è ID quindi impostare Cancel = true. dovrebbe fare il trucco

+0

Quello funzionerebbe ...sebbene vada subito contro il pattern MVVM ... ma senza dubbio funzionerà. –

+4

Grazie, funzionerà bene. In questo caso, non mi interessa molto MVVM poiché DataGrid è parte di un controllo utente personalizzato e non ho problemi a utilizzare code-behind se si tratta di qualcosa che riguarda solo la vista. – Rachel

+0

@Aaron, se ti affidi alla vista per generare la MV, allora penso che scoprirai che non è aderente a MVVM :) –

1

Non posso parlare per 4, tuttavia non era possibile in 3.5 SP1, almeno senza registrarsi per un evento che volevo evitare a tutti i costi.

cosa si potrebbe fare, invece, è modificare il codice di generazione in AutoGenerateColumns=False poi basta posizionare le colonne che ti interessano all'interno del XAML come i dati sottostanti saranno tutti ancora essere collocati all'interno delle colonne in modo appropriato

  <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}"/> 

questo permetterà per visualizzare le sole colonne che ti interessano in relazione al modello sottostante e modificare lo Header da visualizzare come meglio credi, quindi non sei legato al nome Property sul modello.

+0

Questo non è un'opzione per me visto che non conosco i nomi delle colonne in anticipo – Rachel

+0

Questo è non viene generato da un modello? Come sono i dati ...? –

+0

Il modello contiene solo una proprietà DataTable che contiene i dati da visualizzare in DataGrid. – Rachel

0

io non direi che è grande soluzione ... ma ... si può avere un ulteriore livello di astrazione per esempio diciamo che si dispone di un oggetto come:

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

    public string Property2 { get; set; } 

    public string Property3 { set; get; } 
} 

non si vuole colonna per Id, in modo da creare un nuovo oggetto

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

    public string Property3 { set; get; } 
} 

poi map/convertire Foo a foo2 e si è fatto.

Un altro possibile modo (non sempre possibile) è cambiare modificatore di accesso al interno

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

    public string Property2 { get; set; } 

    public string Property3 { set; get; } 
} 

in questo modo non sarà necessario colonna ID generato sia.

2

Altra possibilità sarebbe 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

È possibile utilizzare un comportamento (codice riutilizzabile) per fare il lavoro ... In questo modo è possibile utilizzare l'attributo che centralizzare la visibilità della colonna in un unico luogo.

Usage:

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

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

...

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

Codice:

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

Questo è esattamente quello che stavo cercando! Testato e funzionante su .NET 4.6.1 :) – JoanComasFdz

+0

Grazie! È bello sapere che funziona ancora bene :)! –

+0

Il DataGrid dovrebbe funzionare in questo modo fuori dalla scatola IMHO e raccogliere anche l'intestazione da DisplayNameAttriibute! – StuartQ

Problemi correlati