2010-10-22 51 views

回答

30

,认购AutoGeneratingColumn事件,事件argsDataGridAutoGeneratingColumnEventArgs)的列名和“Cancel”,如果列名是ID然后设置Cancel = true。应该做的伎俩。

+0

这会工作...尽管它立即违背了MVVM模式......但毫无疑问会起作用。 – 2010-10-22 19:29:46

+4

谢谢,这将很好地工作。在这种情况下,我并不太关心MVVM,因为DataGrid是自定义UserControl的一部分,并且如果仅影响View,那么使用后台代码就没有问题。 – Rachel 2010-10-22 19:33:59

+0

@Aaron,如果你依赖视图来生成MV,那么我认为你会发现它不符合MVVM :) – 2010-10-22 19:34:53

1

我不能说4,但是在3.5 SP1中是不可能的,至少没有注册我想要不惜一切代价避免的事件。

你可以做什么,而不是是改变你的代码AutoGenerateColumns=False然后只需将你所关心的XAML中的基础数据都将仍然被放置在列中的列适当

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

这将使您可以显示您关心的底层模型的唯一列,并根据需要将Header更改为显示,因此您不会绑定到模型上的Property名称。

在数据网格
+0

这不是一个选项,我,因为我不知道列名事先 – Rachel 2010-10-22 19:22:42

+0

这是不是从模型生成的?数据是什么样的......? – 2010-10-22 19:25:27

+0

该模型只包含一个DataTable属性,其中包含要在DataGrid中显示的数据。 – Rachel 2010-10-22 19:31:06

0

我不会说这是很好的解决方案...但是...你可以有例如多了一个抽象层 假设你有一个像对象:

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

    public string Property2 { get; set; } 

    public string Property3 { set; get; } 
} 

你不希望列为Id,所以你创建新的对象

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

    public string Property3 { set; get; } 
} 

然后映射/转换Foo到Foo2,你就完成了。

(并不总是可能),另一种可能的方式是访问修饰符更改为内部

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

    public string Property2 { get; set; } 

    public string Property3 { set; get; } 
} 

这样你就不必生成的ID列要么。

2

另一种可能性是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

您可以使用行为(可重用的代码),做的工作......这样你就可以使用属性,它会集中在一个地方的知名度列。

用法:

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

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

...

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

代码:

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

这正是我正在寻找的!经测试并在.NET 4.6.1上工作:) – JoanComasFdz 2016-11-23 14:02:17

+0

谢谢!很高兴知道它仍然工作正常:)! – 2016-11-23 16:52:32

+0

DataGrid应该以这种方式开箱即用,并从DisplayNameAttriibute中挑选标题! – StuartQ 2017-12-12 17:39:03

相关问题