2010-10-22 6 views

Antwort

30

in Ihrem Datagrid, für die AutoGeneratingColumn Ereignis abonnieren, wird das Ereignis args (DataGridAutoGeneratingColumnEventArgs) hat den Spaltennamen und ein „Cancel“, wenn der Spaltenname dann Cancel = true eingestellt ID ist. sollte den Trick machen.

+0

Das würde funktionieren ...obwohl es sofort gegen das MVVM-Muster geht ... aber zweifellos funktionieren wird. –

+4

Danke, das wird gut funktionieren. Ich bin in diesem Fall nicht zu sehr mit MVVM beschäftigt, da das DataGrid Teil eines benutzerdefinierten Benutzersteuerelements ist und ich keine Probleme habe, Code-Behind zu verwenden, wenn es sich nur um die Ansicht handelt. – Rachel

+0

@Aaron, wenn Sie sich auf die Ansicht verlassen, um den MV zu generieren, dann denke ich, dass Sie feststellen werden, dass es MVVM nicht anhaftet :) –

1

Ich kann nicht für 4 sprechen, aber es war nicht in 3.5 SP1, zumindest ohne Registrierung für ein Ereignis, das ich um jeden Preis vermeiden wollte.

Was könnten Sie tun, stattdessen ist Ihre Generation Code AutoGenerateColumns=False ändern legen Sie dann nur die Spalten Sie in der XAML kümmern, da die zugrunde liegenden Daten werden alle noch in geeigneter Weise

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

Diese in den Spalten platziert werden können Sie können die einzigen Spalten anzeigen, die Ihnen in Bezug auf das zugrunde liegende Modell wichtig sind, sowie die Header Anzeige so ändern, wie Sie es für richtig halten, so dass Sie nicht an den Property Namen des Modells gebunden sind.

+0

das keine Option für mich ist, da ich nicht weiß, die Spaltennamen vorher – Rachel

+0

Dies ist Wird nicht von einem Modell generiert? Wie sehen die Daten aus ...? –

+0

Das Modell enthält nur eine DataTable-Eigenschaft, die die Daten enthält, die im DataGrid angezeigt werden sollen. – Rachel

0

würde ich nicht sagen, dass es große Lösung ... aber ... können Sie eine weitere Abstraktionsschicht zum Beispiel haben wir sagen, Sie haben ein Objekt wie:

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

    public string Property2 { get; set; } 

    public string Property3 { set; get; } 
} 

Sie wollen nicht Spalte für Id, so dass Sie ein neues Objekt erstellen

dann Karte/konvertieren Foo zu Foo2 und Sie sind fertig.

Eine weitere Möglichkeit (nicht immer möglich) sind Sie Id Spalte entweder erzeugt haben keinen Zugriff Modifikator interne

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

    public string Property2 { get; set; } 

    public string Property3 { set; get; } 
} 

diese Art und Weise zu ändern.

2

Andere Möglichkeit wäre 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

Sie ein Verhalten (Mehrweg-Code) verwenden können, um die Arbeit zu tun ... Auf diese Weise können Attribut verwenden können, die die Spalte Sichtbarkeit an einem Ort zentralisieren würde.

Verbrauch:

<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

Genau das habe ich gesucht! Getestet und arbeitet an .NET 4.6.1 :) – JoanComasFdz

+0

Danke! Es ist schön zu wissen, dass es immer noch gut funktioniert :)! –

+0

Das DataGrid sollte diesen Weg aus der Box IMHO und holen Sie sich die Überschrift aus dem DisplayNameAttribute auch! – StuartQ

Verwandte Themen