Сетка данных: генерировать столбцы из свойства коллекции ItemsSource - PullRequest
0 голосов
/ 18 ноября 2011

Я пытаюсь создать сетку данных с автоматическим генерированием столбцов.Допустим, моя коллекция - это свойство с именем Articles моей модели представления типа ObservableCollection<ArticleWrapper>.

Теперь я связываю ItemsSource с этой коллекцией:

<wpf:DataGrid ItemsSource={Binding Articles} />

Класс ArticleWrapperнапример:

[c#]
public class ArticleWrapper
{
    public ArticleConfigurationSet ArticleConfigurationSet { get; set; }
    public string Description { get; set; }
}


[vb.net]
Public Class ArticleWrapper
    Public Property ArticleConfigurationSet As ArticleConfigurationSet
    Public Property Description As String
End Class

Класс ArticleConfigurationSet выглядит следующим образом:

[c#]
public class ArticleConfigurationSet
{
    public string Key { get; set; }
    public int Number { get; set; }
}

[vb.net]
Public Class ArticleConfigurationSet
    Public Property Key As String
    Public Property Number As Integer
End Class

Автоматически сгенерированные столбцы выглядят так (пожалуйста, забудьте о CustomEntries): enter image description here

Но теперь моя проблема: я хочу привязать отображаемые данные к своему свойству ArticleConfigurationSet.Но я не могу изменить привязку ItemsSource, потому что свойство SelectedItem таблицы данных должно иметь значение ArticleWrapper (для обработки команд).

Таблица данных также должна выглядеть следующим образом: enter image description here

У вас есть идеи, как это сделать?

Ответы [ 3 ]

2 голосов
/ 18 ноября 2011

Вы можете иметь как AutoGenerateColumns="True", так и определять свои собственные пользовательские столбцы

Например,

<DataGrid ItemsSource="{Binding Articles}" 
          AutoGenerateColumns="True"
          AutoGeneratingColumn="DataGrid_AutoGeneratingColumn">
    <DataGrid.Columns>
        <DataGridColumn Binding="{Binding ArticleConfigurationSet.Key}" Header="Key" />
        <DataGridColumn Binding="{Binding ArticleConfigurationSet.Value}" Header="Value" />
    </DataGrid.Columns>
</DataGrid>

// If we are auto-generating the ArticleConfigurationSet column, 
// cancel it so that column doesn't get rendered
void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    if(e.ColumnName == "ArticleConfigurationSet")
        e.Cancel = true;
}

Возможно, вам придется выполнить некоторый код позади, если вы хотите переставитьпорядок столбцов, однако это должно автоматически генерировать столбцы для всего в вашем объекте, кроме вашего ArticleConfigurationSet столбца, а также добавит два других столбца для ArticleConfigurationSet.Key и ArticleConfigurationSet.Value

1 голос
/ 18 ноября 2011

почему бы не установить AutoGenrateColumns = false и создать динамические столбцы сетки и привязки в зависимости от ваших свойств ArticleConfigurationSet?

вам не нужно менять представление, и вы можете делать то, что хотите.

редактировать: я имею в виду, что вы можете перебирать свои свойства ArticleConfigurationSet (например, с отражением) и создавать ваши Grid-столбцы и привязки.

 foreach(var p in properties)
 {
      //grid add new gridcolumn
      //set binding to ArticleConfigurationSet Property Name
      var b = new Binding("ArticleConfigurationSet"+p.Name);
      //add binding to gridcolumn
 }
1 голос
/ 18 ноября 2011

Установить AutoGenrateColumns = false и использовать ItemTemplate с Lable и привязать его к нужному полю или свойству.

...