2014-09-01 47 views
0

所以我有4類,例如:WPF綁定一個DataGrid到所有可用變量類

Class A Inherits I 
Public name as String 
Public ID as Integer 

Class B Inherits I 
Public test as String 
Public somethingElse as Integer 

Class C Inherits I 
Public banana as String 
Public Type as String 
Public length as Integer 

Class D Inherits I 
Public name as String 
Public ID as String 

說我在我的WPF應用程序中的組合框,包含我對象的列表(有些是的類型A,類型C,等等等等)。

當選擇其中一個時,我希望datagrid使用所選類的公共變量填充 - 左列中的變量名稱和右邊的值。

我希望右欄是可編輯的,但不要直接更新類中的變量。

我的問題是,那麼如果所有/某些變量在每個類中都不相同,如何將數據網格綁定到選定的類?然後,如何保持與變量的關聯,以便稍後如果用戶所做的更改通過我的自定義驗證,我可以更新它?

我的想法(我不知道如何實現):

  • 將各自班級需要某種形式的DataGrid可以綁定到轉換器的方法嗎?但如果是這樣,那麼該方法會返回什麼?

  • 我只需要跟蹤第1行包含這個變量等每個類,所以我可以稍後更新?

回答

1

也許如果你在問你的問題之前試過這個,那麼你已經有你的答案了?在WPF中,DataGrid控件提供了將自動生成其列的功能。事實上,這是默認行爲,如果你不需要,你必須關閉它。然而,就你而言,這聽起來像你想要它留下。

你需要一個ObservableCollection<I>財產在身後或視圖模型將數據綁定到DataGrid.ItemsSource屬性代碼...讓我們稱之爲Items

<DataGrid ItemsSource="{Binding Items}" /> 

現在,這裏的棘手的部分,當您更改類型集合中的對象和要嘗試將數據綁定所有的新特性到DataGrid.Columns集合:

List<A> classAItems = GetClassAItems(); 
Items = new ObservableCollection<I>(classAItems); 

這就是它!顯示出不同的類?:

List<B> classBItems = GetClassBItems(); 
Items = new ObservableCollection<I>(classBItems); 

這就是它!


UPDATE >>>

我怎麼能有兩列 - 「場」 和 「價值」,與每個變量填充行?

我似乎已經在不經意間回答了您的後續問題,而不是您真正的問題。要正確填充所有列標題,應該使用ObservableCollection<object>。爲了只在列標題中填充共同屬性,您應該聲明一個只包含這些屬性的接口。在所有類中實現該接口後,您將能夠在同一個DataGrid中顯示它們(甚至混合使用相同的集合)。

+0

謝謝你,我正在找它。與其將變量名稱作爲列標題,我怎麼能有兩列 - 「字段」和「值」,每個變量填充一行? – simonalexander2005 2014-09-01 15:54:16

+0

RE:更新 - 謝謝,但這不是我的意思。我不希望這些屬性成爲列標題,而是希望它們成爲「行標題」,如果你願意的話。所以我的數據網格總是有兩列,不管我有多少屬性。那有意義嗎? – simonalexander2005 2014-09-01 16:08:21

+0

您需要相應地重構您的數據收集才能完成此操作。 – Sheridan 2014-09-01 16:12:29