I ended up using RadTreeMap instead because I was having trouble with styling RadPivotMap. But here is the relevant markup:
The TypeDefinition looks like this:
Imports Telerik.Windows.Controls
Imports Telerik.Windows.Controls.TreeMap
Imports System.Windows.Media.Imaging
Imports System.Windows.Data
Public Class ImageCustomMapping
Inherits CustomMapping
Protected Overrides Sub Apply(treemapItem As RadTreeMapItem, dataItem As Object)
Dim ie = DirectCast(dataItem, MediaFileEx)
Dim grid = treemapItem.ChildrenOfType(Of Grid).SingleOrDefault
If Not grid Is Nothing Then
grid.Background = New ImageBrush With {.ImageSource = ie.Icon, .Stretch = Stretch.Uniform, .AlignmentX = AlignmentX.Center, .AlignmentY = AlignmentY.Center}
Dim panel As New StackPanel With {.Orientation = Orientation.Horizontal, .HorizontalAlignment = HorizontalAlignment.Left}
Dim tagImage As New Image With {.DataContext = dataItem, .Width = 16, .Height = 16, .HorizontalAlignment = HorizontalAlignment.Left}
tagImage.SetBinding(Image.SourceProperty, New Binding("TagIcon"))
panel.Children.Add(tagImage)
grid.Children.Add(panel)
AddHandler treemapItem.MouseLeftButtonUp, AddressOf ie.MouseLeftButtonUp
Else
' last item ends up here
End If
End Sub
Protected Overrides Sub Clear(treemapItem As RadTreeMapItem, dataItem As Object)
treemapItem.ClearValue(RadTreeMapItem.BackgroundProperty)
End Sub
End Class
The databound object is MediaFileEx:
Imports System.ComponentModel
Imports System.Windows.Media.Imaging
Public Class MediaFileEx
Inherits BrowserWs.MediaFile
Implements INotifyPropertyChanged
Property MyParent As Page
Public ReadOnly Property Icon As BitmapImage
Get
Return New BitmapImage(New Uri(Uri))
End Get
End Property
Property ShouldAdjustRating As Boolean = True
Public ReadOnly Property AdjustedRating As Integer
Get
If ShouldAdjustRating Then
Return (MyParent.Adjustment + Rating)
Else
Return Rating
End If
End Get
End Property
Public Shadows Property Rating As Integer
Get
Return MyBase.Rating
End Get
Set(value As Integer)
MyBase.Rating = value
PropertyChangedHandler("Rating")
End Set
End Property
Public ReadOnly Property TagIcon As BitmapImage
Get
If Not Tags Is Nothing AndAlso Tags.Count > 0 Then
Return MyParent.MyParent.MyParent.TagIcon
Else
Return Nothing
End If
End Get
End Property
Public Property TagsAsString As String
Get
If Tags Is Nothing Then Return String.Empty
Return Join(Tags.ToArray, ", ")
End Get
Set(value As String)
If Tags Is Nothing Then Tags = New BrowserWs.ArrayOfString
Dim sep As String = IIf(InStr(value, ";") > 0, ";", ",")
Tags.Clear()
For Each v In Split(value, sep)
v = LCase(Trim(v))
If Len(v) > 0 AndAlso Not Tags.Contains(v) Then Tags.Add(v)
Next
PropertyChangedHandler("TagIcon")
End Set
End Property
Public Sub MouseLeftButtonUp(sender As Object, e As System.Windows.Input.MouseButtonEventArgs)
'Dim mapItem = DirectCast(sender, RadTreeMapItem)
'Dim hierarchy = DirectCast(mapItem.DataContext, HierarchicalData)
MyParent.MyParent.MyParent.Selection = Me
End Sub
Public Shadows Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
Protected Sub PropertyChangedHandler(ByVal propertyName As String)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
End Sub
Public Sub New(parent As Page, mediaFile As BrowserWs.MediaFile)
MyParent = parent
Me.Source = mediaFile.Source
Me.Name = mediaFile.Name
Me.Uri = mediaFile.Uri
Me.Size = mediaFile.Size
Me.Tags = mediaFile.Tags
Me.Rating = mediaFile.Rating
End Sub
Public Sub New(parent As Page)
MyParent = parent
End Sub
End Class