The following example demonstrates how to create a master-detail grid.
View Example
<Window x:Class="MasterDetailInside.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"
xmlns:local="clr-namespace:MasterDetailInside"
Title="Window1" Height="500" Width="700">
<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>
<dxg:GridControl x:Name="grid" ItemsSource="{Binding Path=Data}" AutoGenerateColumns="AddNew">
<dxg:GridControl.DetailDescriptor>
<dxg:DataControlDetailDescriptor ItemsSourceBinding="{Binding Data}">
<dxg:GridControl AutoGenerateColumns="AddNew"/>
</dxg:DataControlDetailDescriptor>
</dxg:GridControl.DetailDescriptor>
</dxg:GridControl>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MasterDetailInside {
public class ViewModel {
ObservableCollection<ParentTestData> data;
public ObservableCollection<ParentTestData> Data {
get {
if(data == null){
data = new ObservableCollection<ParentTestData>();
for(int i = 0; i < 100; i++) {
ParentTestData parentTestData = new ParentTestData() { Text = "Master" + i, Number = i, Data = new ObservableCollection<TestData>() };
for(int j = 0; j < 50; j++)
parentTestData.Data.Add(new TestData() { Text = "Detail" + j + " Master" + i, Number = j, Ready = j % 2 != 0 });
data.Add(parentTestData);
}
}
return data;
}
}
}
public class TestData : BindableBase
{
protected bool _Ready;
public bool Ready
{
get { return this._Ready; }
set { this.SetProperty(ref this._Ready, value, "Ready"); }
}
protected string _Text;
public string Text
{
get { return this._Text; }
set { this.SetProperty(ref this._Text, value, "Text"); }
}
protected int _Number;
public int Number
{
get { return this._Number; }
set { this.SetProperty(ref this._Number, value, "Number"); }
}
}
public class ParentTestData : BindableBase
{
protected string _Text;
public string Text
{
get { return this._Text; }
set { this.SetProperty(ref this._Text, value, "Text"); }
}
protected int _Number;
public int Number
{
get { return this._Number; }
set { this.SetProperty(ref this._Number, value, "Number"); }
}
protected ObservableCollection<TestData> _Data;
public ObservableCollection<TestData> Data
{
get { return this._Data; }
set { this.SetProperty(ref this._Data, value, "Data"); }
}
}
}
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Namespace MasterDetailInside
Public Class ViewModel
Private _data As ObservableCollection(Of ParentTestData)
Public ReadOnly Property Data() As ObservableCollection(Of ParentTestData)
Get
If _data Is Nothing Then
_data = New ObservableCollection(Of ParentTestData)()
For i As Integer = 0 To 99
Dim parentTestData As New ParentTestData() With {
.Text = "Master" & i,
.Number = i,
.Data = New ObservableCollection(Of TestData)()
}
For j As Integer = 0 To 49
parentTestData.Data.Add(New TestData() With {
.Text = "Detail" & j & " Master" & i,
.Number = j,
.Ready = j Mod 2 <> 0
})
Next j
_data.Add(parentTestData)
Next i
End If
Return _data
End Get
End Property
End Class
Public Class TestData
Inherits BindableBase
Protected _Ready As Boolean
Public Property Ready() As Boolean
Get
Return Me._Ready
End Get
Set(ByVal value As Boolean)
Me.SetProperty(Me._Ready, value, "Ready")
End Set
End Property
Protected _Text As String
Public Property Text() As String
Get
Return Me._Text
End Get
Set(ByVal value As String)
Me.SetProperty(Me._Text, value, "Text")
End Set
End Property
Protected _Number As Integer
Public Property Number() As Integer
Get
Return Me._Number
End Get
Set(ByVal value As Integer)
Me.SetProperty(Me._Number, value, "Number")
End Set
End Property
End Class
Public Class ParentTestData
Inherits BindableBase
Protected _Text As String
Public Property Text() As String
Get
Return Me._Text
End Get
Set(ByVal value As String)
Me.SetProperty(Me._Text, value, "Text")
End Set
End Property
Protected _Number As Integer
Public Property Number() As Integer
Get
Return Me._Number
End Get
Set(ByVal value As Integer)
Me.SetProperty(Me._Number, value, "Number")
End Set
End Property
Protected _Data As ObservableCollection(Of TestData)
Public Property Data() As ObservableCollection(Of TestData)
Get
Return Me._Data
End Get
Set(ByVal value As ObservableCollection(Of TestData))
Me.SetProperty(Me._Data, value, "Data")
End Set
End Property
End Class
End Namespace
See Also