2016-11-28 5 views
0

Я построил datagrid используя datatable, и результаты отображаются правильно. Теперь я намерен добавить ROWHEADERs в datagrid. Я заполнил observable collection<string> и в XAML, я использую это как путь шаблона данных заголовка строки. Тем не менее, он не появляется. Может ли кто-нибудь посоветовать, где проблема?WPF привязка заголовка строки datagrid - Наблюдаемая коллекция

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> 

Это результат я получаю, но без заголовков строк ...

enter image description here

+0

Ваше обязательство ищет визуального предка типа 'DataGridRow', и если он находит его, он привязывается к' DataGridRow.Rownameheaders'. Но 'DataGridRow' не имеет свойства под этим именем. Попробуйте 'Path = DataContext.Rownameheaders [0]' - Я думаю, что вы получите первый заголовок rowname. Ваша следующая проблема заключается в том, как заставить его получить нужный элемент из этой коллекции для каждой строки. Какой-то конвертер с несколькими значениями, я думаю, привязывается к Rownameheaders и тому, от чего он получит индекс. –

+0

Возможно, лучше всего добавить столбец RowHeader в свой DataTable и привязать его к этому. Или используйте коллекцию класса POCO, а не DataTable, и дайте классу POCO свойство, которое будет использоваться в качестве заголовка строки. –

+0

Спасибо @EdPlunkett! В итоге я добавил новый столбец. Пожалуйста, см. Ответ! – user7157732

ответ

0

Я в конечном итоге добавив новый столбец со значениями и настройки расположение столбца до 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; 
} 

надеюсь, что это поможет другим!

Смежные вопросы