2013-01-13 35 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可以顯示的各種類型創建樣式/模板的方法。在這一點上,這似乎是沒有人真正想到的。不管這是因爲我在思考方向上走錯了方向,我還沒有確定。 –

相關問題