2014-09-01 65 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