Indexer Support
In R2 2016, Telerik introduced Indexer Support for RadPropertyGrid's PropertyDefinition bindings. It covers the following scenarios:
For the purposes of this article, we will assume the following class hierarchy is present:
Example 1: The class hierarchy
public class League
{
public string Name { get; set; }
public ObservableCollection<Club> Clubs { get; set; }
public Dictionary<string, Club> ClubsDictionary { get; set; }
}
public class Club
{
public string Name { get; set; }
public DateTime Established { get; set; }
public int StadiumCapacity { get; set; }
public ObservableCollection<Player> Players { get; set; }
public Player this[int index]
{
get { return this.Players.First(x => x.Number == index); }
}
}
public class Player
{
public string Name { get; set; }
public int Number { get; set; }
public string Position { get; set; }
}
Public Class League
Public Property Name() As String
Public Property Clubs() As ObservableCollection(Of Club)
Public Property ClubsDictionary() As Dictionary(Of String, Club)
End Class
Public Class Club
Public Property Name() As String
Public Property Established() As Date
Public Property StadiumCapacity() As Integer
Public Property Players() As ObservableCollection(Of Player)
Default Public ReadOnly Property Item(ByVal index As Integer) As Player
Get
Return Me.Players.First(Function(x) x.Number = index)
End Get
End Property
End Class
Public Class Player
Public Property Name() As String
Public Property Number() As Integer
Public Property Position() As String
End Class
Binding to an Item of a Collection Through Indexer
A common scenario when using RadPropertyGrid is when we have a collection member of our business object. Example 2 shows how to bind to an item at a specified index in the collection:
Example 2: Binding to a collection
<telerik:RadPropertyGrid Item="{Binding League}" AutoGeneratePropertyDefinitions="False">
<telerik:RadPropertyGrid.PropertyDefinitions>
<telerik:PropertyDefinition Binding="{Binding Clubs[0]}" DisplayName="Name" />
</telerik:RadPropertyGrid.PropertyDefinitions>
</telerik:RadPropertyGrid>
Binding of NestedProperties
You can also use indexing in NestedProperties, as shown in Example 3:
Example 3: Binding of NestedProperties
<telerik:RadPropertyGrid Item="{Binding League}" AutoGeneratePropertyDefinitions="False" NestedPropertiesVisibility="Visible">
<telerik:RadPropertyGrid.PropertyDefinitions>
<telerik:PropertyDefinition Binding="{Binding Clubs[0]}" DisplayName="Club">
<telerik:PropertyDefinition.NestedProperties>
<telerik:PropertyDefinition DisplayName="Goalkeeper Name" Binding="{Binding Players[0].Name}"/>
</telerik:PropertyDefinition.NestedProperties>
</telerik:PropertyDefinition>
</telerik:RadPropertyGrid.PropertyDefinitions>
</telerik:RadPropertyGrid>
Binding to a Collection Property with a String Key
As our League class has a Dictionary of clubs, we can access any club by its name, as demonstrated in Example 4.
Example 4: Binding to item in Dictionary
<telerik:RadPropertyGrid Item="{Binding League}" AutoGeneratePropertyDefinitions="False" NestedPropertiesVisibility="Visible">
<telerik:RadPropertyGrid.PropertyDefinitions>
<telerik:PropertyDefinition Binding="{Binding ClubsDictionary[Liverpool]}" DisplayName="Club">
<telerik:PropertyDefinition.NestedProperties>
<telerik:PropertyDefinition DisplayName="Goalkeeper Name" Binding="{Binding Players[0].Name}"/>
</telerik:PropertyDefinition.NestedProperties>
</telerik:PropertyDefinition>
</telerik:RadPropertyGrid.PropertyDefinitions>
</telerik:RadPropertyGrid>
Binding to an Item which Implements an Indexer
Since our Club class implements an indexer, we can also bind to the Player, whose number is 25, for example:
Example 5: Indexing a class that implements indexer
<telerik:RadPropertyGrid Item="{Binding League}" AutoGeneratePropertyDefinitions="False">
<telerik:RadPropertyGrid.PropertyDefinitions>
<telerik:PropertyDefinition Binding="{Binding ClubsDictionary[Liverpool][25]}" DisplayName="Player with number 25" />
</telerik:RadPropertyGrid.PropertyDefinitions>
</telerik:RadPropertyGrid>
Using Unbound Mode
Indexer support also works when AutoGenerateBindingPaths is set to False.
Example 6: Indexing when AutoGenerateBindingPaths is set to False
<telerik:RadPropertyGrid Item="{Binding League}" AutoGenerateBindingPaths="False" AutoGeneratePropertyDefinitions="False" NestedPropertiesVisibility="Visible">
<telerik:RadPropertyGrid.PropertyDefinitions>
<telerik:PropertyDefinition Binding="{Binding ClubsDictionary[Liverpool]}" DisplayName="Club">
<telerik:PropertyDefinition.NestedProperties>
<telerik:PropertyDefinition DisplayName="Chelsea Goalkeeper Name" Binding="{Binding Clubs[Chelsea].Players[0].Name}"/>
</telerik:PropertyDefinition.NestedProperties>
</telerik:PropertyDefinition>
</telerik:RadPropertyGrid.PropertyDefinitions>
</telerik:RadPropertyGrid>