2011-04-02 253 views
3

我正在使用WPF工具包的數據網格,並在過去一直創建的網格綁定到的實體,所以例如與名稱,地址等聯繫實體 在我正在工作的當前應用程序用戶可以從50個表中選擇並單獨選擇表中的字段以生成視圖。 顯然這裏有一個實體綁定將不會工作,因爲綁定源將是動態的。WPF DataGrid綁定

問題是我該怎麼做?

感謝

回答

5

我只是blogged關於如何動態創建基於可重用模型的DataGrid的列。

+0

感謝保羅的幫助。 – Andy 2011-04-16 19:11:18

+0

保羅,您的博客中的代碼工作!我面臨的一個問題是,最後還有一列增加了一個標題爲「屬性」的列,所有列值都是「(集合)」,沒有引號。請讓我知道爲什麼這個專欄出現。謝謝... – Manoj 2012-12-25 13:17:01

0

你可以離開綁定源,因爲它是,但你可以根據他/她需要隱藏或看到什麼用戶的喜好過濾DataGrid的列。

2

最好的解決方案是使用Anonymous Types它完美的作品,看到概念的以下證明:

<Window x:Class="MyProject.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:System="clr-namespace:System;assembly=mscorlib" 
    Title="MainWindow" 
    Height="136" Width="525" 
    Loaded="OnWindowLoaded"> 
<DataGrid ItemsSource="{Binding}"> 

</DataGrid> 

using System.Collections.ObjectModel; 
using System.Linq; 
using System.Windows; 

namespace MyProject { 
    public partial class MainWindow : Window 
    { 
     public class Employee 
     { 
      public int Id { get; set; } 
      public string Code { get; set; } 
      public string Name { get; set; } 
      public int Job { get; set; } 
      public string Address { get; set; } 
     } 

     private ObservableCollection<Employee> _empCollection; 

     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void OnWindowLoaded(object sender, RoutedEventArgs e) 
     { 
      // Generate test data 
      _empCollection = 
       new ObservableCollection<Employee> 
        { 
         new Employee {Id = 234, Code = "E041", Name = "Employee1", Job = 1, Address = "..."}, 
         new Employee {Id = 245, Code = "E701", Name = "Employee2", Job = 3, Address = "..."}, 
         new Employee {Id = 728, Code = "E001", Name = "Employee3", Job = 9, Address = "..."}, 
         new Employee {Id = 663, Code = "E051", Name = "Employee4", Job = 7, Address = "..."}, 
        }; 

      DataContext = 
       (from i in _empCollection 
       select new {i.Code, i.Name, i.Address}).ToList(); 
     } 
    } 
} 
2

一種方法是創建對象的集合,併爲每個反對定製TypeDescriptor

當電網是自動生成的列,它使用反射在你的類 - 例如,客戶,並發現它的性能 - 例如,名字,平衡等

但事實並非完全如此。 WPF本身並沒有完成這項工作 - 它需要一個TypeDescriptor。而且你可以實現自己的TypeDescriptor,所以你可以假裝具有實際不存在的屬性。或者在你的情況下,假裝不是具有確實存在的屬性。

+0

+1爲偉大的偉大的聯繫。如果有選項,我會給+2) – 2011-04-03 07:51:48

+0

我會使+2 :) – ChandlerPelhams 2012-10-22 14:20:20