将复杂对象绑定到DataGrid

时间:2012-11-25 09:18:17

标签: c# wpf datagrid

假设我有一个ObservableCollection(类型MyRow)(称为Rows)行。在MyRow中,我有一堆属性,包括一个ObservableCollection(类型MyRowContents)(称为Contents) - 它基本上是该行中所有内容的列表。 MyRowContents还有几个属性,包括DisplayContents(string)。

例如......对于包含2行和3列的DataGrid,数据结构为2“Rows”,每个包含3个“Contents”。

我在XAML的DataGrid中需要做什么,以便单元格内容显示Rows [i] .Contents [j] .DisplayContents?

编辑:

嗨,抱歉在初始消息中不够清楚。我正在尝试创建一个能够动态显示数据的数据网格(来自提前未知的数据库表)。

我已将此作为指南:http://pjgcreations.blogspot.com.au/2012/09/wpf-mvvm-datagrid-column-collection.html - 我可以动态显示列。

    <DataGrid ItemsSource="{Binding Rows}" AutoGenerateColumns="False" 
              w:DataGridExtension.Columns="{Binding ElementName=LayoutRoot, Path=DataContext.Columns}" />

我只是不知道如何动态显示行数据。

MyRow是:

public class MyRow
{
    public int UniqueKey { get; set; }
    public ObservableCollection<MyRowContents> Contents { get; set; }
}

MyRowContents是:

public class MyRowContents
{
    public string ColumnName { get; set; } // Do I need this?
    public object DisplayContents { get; set; } // What I want displayed in the grid cell
}

我的视图模型中有一个公共属性ObservableCollection行,你可以看到我在ItemsSource中绑定的内容。但我不知道如何让每个MyRowContents的“DisplayContents”显示在网格视图中的相应单元格中。

鉴于我可以动态显示列名,可以做出以下假设:内容中的项目顺序(在MyRow中)将与列的顺序相匹配。

由于

1 个答案:

答案 0 :(得分:1)

首先,您必须在RowContent中放置行ID,以便您的应用逻辑类似于:

RowContent.cs:

public class RowContent
{
    //public string ColumnName { get; set; } "you dont need this property."

    public int ID;  //You should put row ID here.
    public object DisplayContents { get; set; } "What is this property type, is string or int or custom enum??"
}

RowViewModel.cs:

public class RowViewModel
{
    public ObservableCollection<MyRowContents> Contents { get; set; }
}

现在你必须把你的Collection放在Window.DataContext中才能在DataGrid中绑定它

MainWindow.xaml.cs:

public partial class MainWindow : Window
{
    private RowViewModel rvm = new RowViewModel(); //Here i have made new instance of RowViewModel, in your case you have to put your ViewModel instead of "new RowViewModel();";

    public MainWindow()
    {
        InitializeComponent();

        DataContext = rvm; // this is very important step.
    }
}

最后一步是在XAML窗口中。

MainWindow.xaml:

<DataGrid ItemsSource="{Binding Path=Contents}" AutoGenerateColumns="false">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Row ID" Binding="{Binding Path=ID,UpdateSourceTrigger=PropertyChanged}"/>
        <DataGridTextColumn Header="your row header" Binding="{Binding Path=DisplayContents,UpdateSourceTrigger=PropertyChanged}"/>
    </DataGrid.Columns>
</DataGrid>

有五种类型的DataGridColumn,您必须根据DisplayContents属性的类型选择合适的类型。