2013-01-13 21 views
0

假设以下两个虚构类:模板使用的业务对象的集合在DataGrid

public class Person 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public decimal Salary { get; set; } 
    public string SSN { get; set; } 
} 

public class People: ObservableCollection<Person> {} 

假设我想在DataGrid中有以下考虑显示人对象的实例:

  • ID应只读
  • 工资应该被格式化为货币
  • SSN不应该显示

我知道如何做一些非常简单的东西,样式和模板,但我似乎无法找到任何关于使用它们来指示DataGrid应该如何显示数据的好信息。如何做到这一点的一个例子将是很好的,任何关于这个主题的良好资源的链接将不胜感激。

+0

或者我在这里甚至可能问到什么? –

+0

检查我的答案,这不是关于模板或样式,但我认为这可能对您有用。 – Hannish

+0

我在这里找到了一些信息:http://www.paulstovell.com/dynamic-datagrid。我不太想做他在做什么,但我想我可以通过他的博客收集到的信息来弄清楚我想要什么。 –

回答

1

我认为你是在寻找DisplayAttribute System.ComponentModel.DataAnnotations命名空间。您可以指定是否显示该字段,列标题,列顺序等。您可以在每个字段中使用多个注释。

在你的榜样,你会需要这样的东西:

using System.ComponentModel.DataAnnotations 

public class Person 
{ 
    [Editable(false)] 
    [Display(Name = "Person ID", Order = 0)] 
    public int Id { get; set; } 

    [MaxLength(30, ErrorMessage = "too long!")] 
    [Display(Name = "First Name", Order = 10)] 
    public string FirstName { get; set; } 

    [Display(Name = "Last Name", Order = 20)] 
    public string LastName { get; set; } 

    [DisplayFormat(DataFormatString="C")] 
    [Display(Name = "$/year", Order = 30)] 
    public decimal Salary { get; set; } 

    [Display(AutoGenerateField=false)] 
    public string SSN { get; set; } 
} 

这些信息将被用于任何时候你自动生成的字段。你甚至可以创建字段组,将它们分组成标签等。

希望这是你正在寻找的答案。

+0

谢谢Hannish。这仍然不是我想要的,但非常接近。这个想法是正确的,除了使用这种方法限制你一个'模板'。我可能需要另一个显示不同的类的另一个模板。如果没有其他人提高,我可能会标记这个答案,因为它肯定是下一个最好的东西。 –

+0

谢谢布兰登。显示属性仅适用于自动生成某些内容(如列)时,仍然可以使用以不同方式显示所有内容的模板。如果您不能使用XAML模板,并且同一类需要不同的显示器,恐怕您必须按照您在其他答案的评论中所说的动态执行此操作。如果您想出另一个想法,请发布它!问候。 – Hannish

+0

@BrandonMoore有没有运气得到解决? – Hannish

0

是的,你可以手动设置AutoGenerateColumnsFalse并指定列要显示和可定制按您的需求是这样的 -

<DataGrid ItemsSource="{Binding People}" 
       AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding Id}" IsReadOnly="True"/> 
      <DataGridTextColumn Binding="{Binding FirstName}"/> 
      <DataGridTextColumn Binding="{Binding LastName}"/> 
      <DataGridTextColumn Binding="{Binding Salary, StringFormat=C}"/> 
     </DataGrid.Columns> 
    </DataGrid> 
+0

这个想法是有一个DataGrid可以显示各种业务对象集合类型,所以硬编码它们绑定的列和属性的数量已经不存在了。然而,我正在处理的当前解决方案在代码中动态执行此操作。我后来的确是一种为DataGrid可以显示的各种类型创建样式/模板的方法。在这一点上,这似乎是没有人真正想到的。不管这是因为我在思考方向上走错了方向,我还没有确定。 –