WPF Datagrid: Objekte mit internen Arrays abbilden

  • WPF

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von MarioD.

    WPF Datagrid: Objekte mit internen Arrays abbilden

    Hallo Zusammen,

    Ich möchte eine Liste von Objekten in einem Datagrid darstellen. Die Objekte sind vom Typ HolidayPlan und beinhalten ein Objekt vom Typ Employee
    und ein eindimensionales int-Array mit 53 Feldern. Hier etwas vereinfacht meine Klassen:

    VB.NET-Quellcode

    1. Public Class HolidayPlan
    2. Dim _employee As Employee
    3. Dim _weeks AS Integer[]
    4. End Class
    5. Public Class Employee
    6. Dim _employeeId As integer
    7. Dim _name As String
    8. End Class


    Nun möchte ich die Liste als ObservableCollection<HolidayPlan> derart an ein Datagrid binden, dass ich folgende Ansicht habe:


    empoyeeId
    name
    week1
    week2
    week3
    week4
    ...
    1234
    mustermann
    0
    0
    5
    0
    ...
    2345
    musterfrau
    5
    5
    0
    0
    ...


    Die ersten beiden Spalten sollen an die Variablen des Employee-Objektes gebunden werden und die restlichen Spalten an die Werte des int-Arrays.
    Ich habe das Problem bis jetzt so gelöst, dass ich die HolidayPlan-Daten in Objekte der Klasse HolidayPlanGrid

    VB.NET-Quellcode

    1. Public Class HolidayPlanGrid
    2. Dim _employeeId As integer
    3. Dim _name As String
    4. Dim _week1 As Integer
    5. Dim _week2 As Integer
    6. Dim _week3 As Integer
    7. ...
    8. End Class



    umgewandelt habe und das Grid an eine ObservableCollection<HolidayPlanGrid> gebunden habe. Das funktioniert auch, ist aber mit 53 week-Integerwerte nicht gerade sehr schön bei Datenänderungen.

    Hat da jemand einen Tip für mich?

    Mario
    man kann Xaml auch an Indexer binden, also sowas ist möglich

    XML-Quellcode

    1. <DatagridTextColumn Text="{Binding Week[2]}"/>
    (so ähnlich) würde an die 3. Woche binden. Dazu sollte man im Viewmodel eine ObservableCollection halten, damit man bei codeseitigen Änderungen ein geeignetes PropertyChangedEvent feuern kann.

    (ich setze jetzt mal die Grundlagen von MVVM bei dir voraus)
    Hallo nochmal,

    super! Vielen Dank für den Tip! Die Variablen der Klasse Employee binde ich über zusätzliche Properties an die Spalten!

    Anbei meine Lösung (leider nur in C#)! :)

    Gruß,

    Mario

    C#-Quellcode

    1. //MainWindow
    2. public partial class MainWindow : Window
    3. {
    4. DataGrid dataGrid = new DataGrid();
    5. ObservableCollection<ViewModelHolidayPlan> _hpCollection = new ObservableCollection<ViewModelHolidayPlan>();
    6. public MainWindow()
    7. {
    8. InitializeComponent();
    9. int[] weeks = { 0, 5, 0, 5, 0 };
    10. HolidayPlan holidayPlan = new HolidayPlan(new Employee(1234, "mustermann"), weeks);
    11. _hpCollection.Add(new ViewModelHolidayPlan(holidayPlan));
    12. int[] weeks2 = { 4, 0, 4, 0, 4 };
    13. holidayPlan = new HolidayPlan(new Employee(2345, "musterfrau"), weeks2);
    14. _hpCollection.Add(new ViewModelHolidayPlan(holidayPlan));
    15. var column0 = new DataGridTextColumn();
    16. column0.Header = "employeeId";
    17. column0.Binding = new Binding("EmployeeId");
    18. dataGrid.Columns.Add(column0);
    19. var column1 = new DataGridTextColumn();
    20. column1.Header = "name";
    21. column1.Binding = new Binding("Name");
    22. dataGrid.Columns.Add(column1);
    23. for (int i = 0; i < weeks.Length; i++)
    24. {
    25. var column = new DataGridTextColumn();
    26. column.Header = "week" + i;
    27. column.Binding = new Binding("Weeks [" + i + "]");
    28. dataGrid.Columns.Add(column);
    29. }
    30. dataGrid.ItemsSource = _hpCollection;
    31. }
    32. }
    33. }
    34. // ViewModel der Klasse Holidayplan
    35. class ViewModelHolidayPlan : INotifyPropertyChanged
    36. {
    37. public event PropertyChangedEventHandler PropertyChanged;
    38. #region INotifyPropertyChanged
    39. protected void OnPropertyChanged(string propertyName)
    40. {
    41. if (PropertyChanged != null)
    42. PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    43. }
    44. #endregion INotifyPropertyChanged
    45. public ViewModelHolidayPlan (HolidayPlan holidayPlan)
    46. {
    47. _employee = new ViewModelEmployee(holidayPlan.employee);
    48. _weeks = holidayPlan.weeks;
    49. }
    50. ViewModelEmployee _employee;
    51. public ViewModelEmployee Employee
    52. {
    53. get
    54. {
    55. return _employee;
    56. }
    57. set
    58. {
    59. _employee = value;
    60. OnPropertyChanged("Employee");
    61. }
    62. }
    63. //Properties für die Spalten-Bindung
    64. public int EmployeeId
    65. {
    66. get
    67. {
    68. return Employee.EmployeeId;
    69. }
    70. set
    71. {
    72. Employee.EmployeeId = value;
    73. OnPropertyChanged("EmployeeId");
    74. }
    75. }
    76. public string Name
    77. {
    78. get
    79. {
    80. return Employee.Name;
    81. }
    82. set
    83. {
    84. Employee.Name = value;
    85. OnPropertyChanged("Name");
    86. }
    87. }
    88. int [] _weeks;
    89. public int[] Weeks
    90. {
    91. get
    92. {
    93. return _weeks;
    94. }
    95. set
    96. {
    97. _weeks = value;
    98. OnPropertyChanged("Weeks");
    99. }
    100. }
    101. }
    102. // ViewModel der Klasse Employee
    103. class ViewModelEmployee
    104. {
    105. public event PropertyChangedEventHandler PropertyChanged;
    106. #region INotifyPropertyChanged
    107. protected void OnPropertyChanged(string propertyName)
    108. {
    109. if (PropertyChanged != null)
    110. PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    111. }
    112. #endregion INotifyPropertyChanged
    113. public ViewModelEmployee (Employee employee)
    114. {
    115. employeeId = employee._employeeId;
    116. name = employee._name;
    117. }
    118. private int employeeId;
    119. public int EmployeeId
    120. {
    121. get
    122. {
    123. return employeeId;
    124. }
    125. set
    126. {
    127. employeeId = value;
    128. OnPropertyChanged("EmployeeId");
    129. }
    130. }
    131. private string name;
    132. public string Name
    133. {
    134. get
    135. {
    136. return name;
    137. }
    138. set
    139. {
    140. name = value;
    141. OnPropertyChanged("Name");
    142. }
    143. }
    144. }
    145. class HolidayPlan
    146. {
    147. public Employee employee { get; set; }
    148. public int[] weeks { get; set; }
    149. public HolidayPlan(Employee employee, int[] weeks)
    150. {
    151. this.employee = employee;
    152. this.weeks = weeks;
    153. }
    154. }
    155. class Employee
    156. {
    157. public int _employeeId { get; set; }
    158. public string _name { get; set; }
    159. public Employee(int employeeId, string name)
    160. {
    161. _employeeId = employeeId;
    162. _name = name;
    163. }
    164. }