wpfvb.netxamldatagridcelltemplate

WPF vb.net Apply different button to rows in datagrid


I am creating a column in my DataGrid with

<DataGridTextColumn Header="Deploy" Binding="{Binding Deploy}" Width="100" IsReadOnly="True" CanUserSort="False"/>

In my code, I am adding rows to the columns in my grid using

Public Structure MyRow
    Public Property Deploy As String
End Structure



MyGrid.Items.Add(New MyRow With {.Deploy= "Unlimited"})

What I really want to be doing, is in this Deploy field, I want to display one of two buttons dependent on a value. If I have the value 0, I want to display

<Button Grid.Column="3" Padding="0" Content="A" Margin="5,8,5,12" Height="50" TextBlock.TextAlignment="Center" />

And if I have the value -1 I want to display

<Button Grid.Column="3" Padding="0" Content="B" Margin="5,8,5,12" Height="50" TextBlock.TextAlignment="Center" />

Any help as to how would be appreciated! I've tried using a CellTemplateSelector

<Page.Resources>
    <DataTemplate x:Key="ATemplate">
        <Button Grid.Column="3" Padding="0" Content="A" Margin="5,8,5,12" Height="50" TextBlock.TextAlignment="Center" />
    </DataTemplate>
    <DataTemplate x:Key="BTemplate">
        <Button Grid.Column="3" Padding="0" Content="B" Margin="5,8,5,12" Height="50" TextBlock.TextAlignment="Center" />
    </DataTemplate>
</Page.Resources>


...
<DataGridTemplateColumn Header="A" Width="60" CanUserSort="False" CellTemplateSelector="{StaticResource ButtonTemplateSelector}" />
...

But then I don't know how I could then apply this template when I am adding a row to the DataGrid

Thanks in advance


Solution

  • Just implement your logic in the ButtonTemplateSelector:

    Public Class ButtonTemplateSelector
        Inherits DataTemplateSelector
    
        Public Property ATemplate As DataTemplate
        Public Property BTemplate As DataTemplate
    
        Public Overrides Function SelectTemplate(item As Object, container As DependencyObject) As DataTemplate
    
            If item IsNot Nothing Then
                Dim myRow = CType(item, MyRow)
                If myRow.Deploy Is "0" Then
                    Return ATemplate
                Else
                    Return BTemplate
                End If
            End If
    
            Return MyBase.SelectTemplate(item, container)
        End Function
    
    End Class
    

    XAML:

    <DataGridTemplateColumn Header="A" Width="60" CanUserSort="False" >
        <DataGridTemplateColumn.CellTemplateSelector>
            <local:ButtonTemplateSelector ATemplate="{StaticResource ATemplate}"
                                          BTemplate="{StaticResource BTemplate}" />
        </DataGridTemplateColumn.CellTemplateSelector>
    </DataGridTemplateColumn>