Hello
We trying to implement the master-detail WPF app to learn the capabilities of Telerik RadGridView.
It is a simple application which has RadGridView with the following markup:
Under the hood is view model which is set to DataContext of the main windows where Telerik RadGridView is placed, as follows:
Persons and Details are fields of view model which are ObservableCollection of appropriate instances.
PersonDetails.cs:
Person.cs:
MainViewModel.cs:
We can't get working hierarchical RadGridView. When we trying to expand the parent row, we see the following in the Output window:
System.Windows.Data Error: 40 : BindingExpression path error: 'Details' property not found on 'object' ''Person' (HashCode=43402647)'.
BindingExpression:Path=Details; DataItem='Person' (HashCode=43402647); target element is 'RadGridView' (Name=''); target property is 'ItemsSource' (type 'Object')
We can't figure out what is wrong here, can you help us?
We trying to implement the master-detail WPF app to learn the capabilities of Telerik RadGridView.
It is a simple application which has RadGridView with the following markup:
<
telerik:RadGridView
ItemsSource
=
"{Binding Persons}"
SelectedItem
=
"{Binding Selectedperson, Mode=TwoWay}"
VerticalAlignment
=
"Stretch"
HorizontalAlignment
=
"Stretch"
AutoGenerateColumns
=
"True"
telerik:StyleManager.Theme
=
"Windows7"
>
<
telerik:RadGridView.ChildTableDefinitions
>
<
telerik:GridViewTableDefinition
>
</
telerik:GridViewTableDefinition
>
</
telerik:RadGridView.ChildTableDefinitions
>
<
telerik:RadGridView.HierarchyChildTemplate
>
<
DataTemplate
>
<
telerik:RadGridView
AutoGenerateColumns
=
"True"
telerik:StyleManager.Theme
=
"Windows7"
ItemsSource
=
"{Binding Details}"
>
</
telerik:RadGridView
>
</
DataTemplate
>
</
telerik:RadGridView.HierarchyChildTemplate
>
</
telerik:RadGridView
>
namespace
MasterDetailViaDataTables
{
public
partial
class
MainWindow : Window
{
public
MainWindow()
{
InitializeComponent();
this
.DataContext =
new
MainViewModel();
}
Persons and Details are fields of view model which are ObservableCollection of appropriate instances.
PersonDetails.cs:
namespace
MasterDetailViaDataTables
{
public
class
PersonDetails : BindableBase
{
private
int
_PersonID;
public
int
PersonID
{
get
{
return
_PersonID; }
set
{
this
.SetProperty<
int
>(
ref
this
._PersonID, value); }
}
private
string
address;
public
string
Address
{
get
{
return
address; }
set
{
this
.SetProperty<
string
>(
ref
this
.address, value); }
}
private
string
_Description;
public
string
Description
{
get
{
return
_Description; }
set
{
this
.SetProperty<
string
>(
ref
this
._Description, value); }
}
public
static
ObservableCollection<PersonDetails> GetDetails()
{
ObservableCollection<PersonDetails> details =
new
ObservableCollection<PersonDetails>();
try
{
DataTable table =
new
DataTable(
"persondetail"
);
DataColumn PersonID =
new
DataColumn(
"PersonID"
,
typeof
(System.Int64));
DataColumn Address =
new
DataColumn(
"Address"
,
typeof
(System.String));
DataColumn Description =
new
DataColumn(
"Description"
,
typeof
(System.String));
table.Columns.Add(PersonID);
table.Columns.Add(Address);
table.Columns.Add(Description);
for
(
int
pID = 1; pID <= 5; pID++)
{
for
(
int
i = 0; i < 2; i++)
{
DataRow row = table.NewRow();
row[
"PersonID"
] = pID;
row[
"Address"
] =
"Address"
+ (pID-1).ToString() +
" - "
+ i.ToString();
row[
"Description"
] =
"Description"
+ (pID-1).ToString() +
" - "
+ i.ToString();
table.Rows.Add(row);
}
}
details.Clear();
for
(
int
i = 0; i < table.Rows.Count; ++i)
details.Add(
new
PersonDetails
{
PersonID = Convert.ToInt32(table.Rows[i][0]),
Address = table.Rows[i][1].ToString(),
Description = table.Rows[i][2].ToString()
});
}
catch
(Exception ex)
{
Console.WriteLine(ex.Message);
}
return
details;
}
}
public
class
Person : BindableBase
{
private
int
_PersonID;
private
string
_FirstName;
private
string
_LastName;
public
int
PersonID
{
get
{
return
_PersonID; }
set
{
this
.SetProperty<
int
>(
ref
this
._PersonID, value); }
}
public
string
FirstName
{
get
{
return
_FirstName; }
set
{
this
.SetProperty<
string
>(
ref
this
._FirstName, value); }
}
public
string
LastName
{
get
{
return
_LastName; }
set
{
this
.SetProperty<
string
>(
ref
this
._LastName, value); }
}
public
static
ObservableCollection<Person> GetPersons()
{
ObservableCollection<Person> persons =
new
ObservableCollection<Person>();
try
{
DataTable table =
new
DataTable(
"person"
);
DataColumn id =
new
DataColumn(
"PersonID"
,
typeof
(System.Int64));
id.AutoIncrement =
true
;
id.AutoIncrementSeed = 1;
DataColumn FirstName =
new
DataColumn(
"FirstName"
,
typeof
(System.String));
DataColumn LastName =
new
DataColumn(
"LastName"
,
typeof
(System.String));
table.Columns.Add(id);
table.Columns.Add(FirstName);
table.Columns.Add(LastName);
for
(
int
i = 0; i < 5; i++)
{
DataRow row = table.NewRow();
row[
"FirstName"
] =
"FirstName"
+ i.ToString();
row[
"LastName"
] =
"LastName"
+ i.ToString();
table.Rows.Add(row);
}
persons.Clear();
for
(
int
i = 0; i < table.Rows.Count; ++i)
persons.Add(
new
Person
{
PersonID = Convert.ToInt32(table.Rows[i][0]),
FirstName = table.Rows[i][1].ToString(),
LastName = table.Rows[i][2].ToString()
});
}
catch
(Exception ex)
{
Console.WriteLine(ex.Message);
}
return
persons;
}
}
public
class
MainViewModel : BindableBase, INotifyPropertyChanged
{
public
MainViewModel()
{
this
.Persons = Person.GetPersons();
}
private
ObservableCollection<Person> personValues;
public
ObservableCollection<Person> Persons
{
get
{
return
personValues; }
set
{
this
.SetProperty<ObservableCollection<Person>>(
ref
this
.personValues, value); }
}
private
ObservableCollection<PersonDetails> detailsvalues;
public
ObservableCollection<PersonDetails> Details
{
get
{
if
(
this
.Selectedperson ==
null
)
{
return
null
;
}
return
this
.LoadDetails(
this
.Selectedperson.PersonID);
}
}
private
ObservableCollection<PersonDetails> LoadDetails(
int
personID)
{
ObservableCollection<PersonDetails> details =
new
ObservableCollection<PersonDetails>();
foreach
(PersonDetails detail
in
PersonDetails.GetDetails().Where(item => item.PersonID == personID))
{
details.Add(detail);
}
return
details;
}
private
Person selectedPersonValue;
public
Person Selectedperson
{
get
{
return
selectedPersonValue; }
set
{
this
.SetProperty<Person>(
ref
this
.selectedPersonValue, value);
this
.RaiseNotification(
"Details"
);
}
}
}
We can't get working hierarchical RadGridView. When we trying to expand the parent row, we see the following in the Output window:
System.Windows.Data Error: 40 : BindingExpression path error: 'Details' property not found on 'object' ''Person' (HashCode=43402647)'.
BindingExpression:Path=Details; DataItem='Person' (HashCode=43402647); target element is 'RadGridView' (Name=''); target property is 'ItemsSource' (type 'Object')
We can't figure out what is wrong here, can you help us?