Динамически добавлять столбец в сетку данных или создавать сетку данных с определенными столбцами из списка

Я уже несколько дней борюсь с datagrid databinding ..

Я пытаюсь создать datagrid динамически из list настраиваемых объектов. Поскольку количество свойств объекта списка, которые мне нужно отобразить, может измениться, я не знаю ни точного количества столбцов, ни их заголовков.

Поэтому я подумал, что я буду динамически добавлять только нужные мне столбцы и создавать для них привязки (к конкретным свойствам объекта). После этого я заполнял datagrid данными из list на основе привязок.

Например:

Создаю пустой datagrid

   <DataGrid x:Name="MyDataGrid" AutoGenerateColumns="false" ItemsSource="{Binding}" Margin="0,0,0,31" Grid.RowSpan="2">
   </DataGrid>

Я создаю свой список для хранения моих данных и объекта данных:

Public Class Res
    Public Shared TableData As New List(Of DataItem)
End Class

Public Class DataItem
    Public Property Name() As String
    Public Property MyProperty() As String
    Public Property Prop() As String
    Public Property Prop1() As String
End Class

Теперь предположим, что я хочу показать только столбец Name в моем datagrid, поэтому я добавляю столбец с определенной привязкой (предположительно, в этом и заключается проблема, но я не могу ее понять):

    Dim col As New DataGridTextColumn
    Dim bb As New Binding

    bb.Path = New PropertyPath("Name")
    bb.Mode = BindingMode.TwoWay
    bb.Source = Res.TableData

    col.Binding = bb
    col.Header = "Name"

    MyDataGrid.Columns.Add(col)

Затем я наконец создаю и добавляю данные в свой список:

    Dim entry As New DataItem

    entry.Name = "Test Name"
    entry.MyProperty = "Test Property"
    entry.Prop = "one Entry"

    Res.TableData.Add(entry)

    Me.MyDataGrid.ItemsSource = Res.TableData

В результате весь столбец заполнен теми же данными. Я намеревался заполнить только ту строку, которая соответствует точному list элементу. Например, если позже я захочу добавить в list еще один элемент с другим «Именем», он также должен отображаться в datagrid как другая строка с другим «Именем».


person Emi    schedule 26.02.2015    source источник


Ответы (1)


Я предлагаю вам привязать свою сетку к свойству List, иметь AutoGenerateColumns = True и слушать AutoGeneratingColumn там, где вы решаете, хотите ли вы добавить этот столбец в сетку или нет.

person Muds    schedule 26.02.2015
comment
Хорошо, поскольку я относительно новичок в WPF, я понятия не имею, что вы предлагаете. Думаю, я попробую разобраться, как слушать AutoGeneratingColumn. - person Emi; 26.02.2015
comment
Я думаю, у вас есть логика относительно того, какие столбцы должны быть добавлены в вашу сетку? Итак, позвольте сетке автоматически генерироваться, и когда она будет генерироваться, проверьте вашу логику и решите, добавлять или нет .. дайте мне знать, если вам нужны разъяснения - person Muds; 26.02.2015
comment
Все заработало. Это помогло. Хотя это кажется странным, но работает. Спасибо за идею! - person Emi; 26.02.2015