【问题标题】:WPF datagrid row header binding - Observable collectionWPF datagrid 行标题绑定 - 可观察的集合
【发布时间】:2017-04-12 15:04:10
【问题描述】:

我已经使用数据表构建了一个数据网格,结果显示正确。 现在我打算将 ROWHEADERs 添加到数据网格中。我填充了一个observable collection<string>,在XAML 中,我将其用作行标题数据模板路径。尽管如此,它仍然没有出现。有人可以建议问题出在哪里吗?

public ObservableCollection<string> Rownameheaders { get; set; } //in the main .cs

//xaml.cs
public void Form1_load(object sender, EventArgs e)
{
    WF_CRM_RPluginModel model = DataContext as WF_CRM_RPluginModel;
    var hello1 =  new ObservableCollection<String>();

    for(int i=0; i< model.prodwells.Count;i++)
    {
        hello1.Add(model.prodwells[i]);
    }

    model.Rownameheaders = hello1;

    List<double[]> list = new List<double[]>();
    for (int i = 0; i < model.RowFijtable; i++)
    {
        double[] rowdata = new double[model.ColFijtable];
        for (int j = 0; j < model.ColFijtable; j++)
        {
            rowdata[j] = model.TauTable[i, j];
        }

        list.Add(rowdata);
    }

    DataTable table = ConvertListToDataTable(list);

    dataGridView1.ItemsSource = table.AsDataView();  
}

private DataTable ConvertListToDataTable(List<double[]> list)
{
    DataTable table = new DataTable();
    WF_CRM_RPluginModel model = DataContext as WF_CRM_RPluginModel;
    // Get max columns.
    int columns = 0;
    foreach (var array in list)
    {
        if (array.Length > columns)
        {
            columns = array.Length;
        }
    }

    // Add columns.
    for (int i = 0; i < columns; i++)
    {
        // Provide default column name & data type
        table.Columns.Add(model.injwells[i], typeof(double));
    }

    // Add rows.
    foreach (var array in list)
    {
        // assign each array element to the appropriate column
        var row = table.NewRow();

        for (int i = 0; i < array.Length; ++i)
            row.SetField(i, array[i]);

        table.Rows.Add(row);
    }

    return table;
}

XAML:

<DataGrid Name="dataGridView1" Loaded="Form1_load" ItemsSource="{Binding}" AutoGenerateColumns="True"                                          AlternatingRowBackground="Gainsboro" CanUserSortColumns="False">
    <DataGrid.RowHeaderTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRow}}, Path=Rownameheaders}"/>
        </DataTemplate>
    </DataGrid.RowHeaderTemplate> 
</DataGrid>

这是我得到的结果,但没有行标题...

【问题讨论】:

  • 你的绑定寻找DataGridRow类型的视觉祖先,如果找到,它绑定到DataGridRow.Rownameheaders。但是DataGridRow 没有该名称的属性。试试Path=DataContext.Rownameheaders[0]——我想这会让你得到第一个行名标题。您的下一个问题是如何使其从该集合中为每一行获取正确的项目。我猜是某种多值转换器,它绑定到 Rownameheaders 以及它会从中获取索引的东西。
  • 也许您最好的选择是将 RowHeader 列添加到您的 DataTable 并绑定到该列。或者使用 POCO 类的集合而不是 DataTable,并为 POCO 类提供将用作行标题的属性。
  • 感谢@EdPlunkett!我最终添加了一个新列。请看答案!

标签: c# wpf xaml datagrid observablecollection


【解决方案1】:

我最终添加了一个带有值的新列,并将列位置设置为数据表中的 0。以下是更新后的代码:

private DataTable ConvertListToDataTable(List<double[]> list)
{
    DataTable table = new DataTable();
    WF_CRM_RPluginModel model = DataContext as WF_CRM_RPluginModel;
    // Get max columns.
    int columns = 0;
    foreach (var array in list)
    {
        if (array.Length > columns)
        {
            columns = array.Length;
        }
    }

   // Add columns.
    for (int i = 0; i < columns; i++)
    {
        // Provide default column name & data type
        table.Columns.Add(model.injwells[i], typeof(double));

    }

    // Add rows.
    foreach (var array in list)
    {
        // assign each array element to the appropriate column
        var row = table.NewRow();
        for (int i = 0; i < array.Length; ++i)
            row.SetField(i, array[i]);
        table.Rows.Add(row);
    }

    //ADDED below part
    DataColumn newCol = new DataColumn("Prod Name", typeof(string));
    newCol.AllowDBNull = true;
    table.Columns.Add(newCol);
    newCol.SetOrdinal(0);
    int m = 0;
    foreach(DataRow row in table.Rows)
    {
        row["Prod Name"] = model.prodwells[m];
        m = m + 1;
    }

    return table;
}

希望它也能帮助其他人!

【讨论】:

    猜你喜欢
    • 2015-03-07
    • 2016-11-08
    • 2019-03-20
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 2020-12-29
    相关资源
    最近更新 更多