1

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

例如...对于具有 2 行和 3 列的 DataGrid,数据结构将是 2 个“行”,每个包含 3 个“内容”。

我必须在 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}" />

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

我的行是:

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 Rows,如您所见,这是我在 ItemsSource 中绑定的。但我不知道如何让每个 MyRowContents 的“DisplayContents”显示在网格视图的相应单元格中。

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

谢谢

4

1 回答 1

2

首先,您必须将行 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 属性的类型选择合适的类型。

于 2012-11-25T11:17:15.503 回答