Search code examples
wpfdatatemplateinfragisticsxamgrid

EditorTemplate for TemplateColumn in XamGrid not working


I have a XamGrid with two columns, Name and Type. Depending on Type, I want to have a different kind of column for Name, thus I'm using a TemplateColumn. In the data template I have a ContentControl with a default ContentTemplate and a DataTrigger that sets the ContentTemplate to a different column style if Type is a specific value. I am setting alll four templates (ItemTemplate, EditorTemplate, AddNewRowItemTemplate, AddNewRowEditorTemplate) of the TemplateColumn to this data template.

ItemTemplate, AddNewRowItemTemplate and AddNewRowEditorTemplate work as intended, however EditorTemplate does not, see attached pictures:

<code>ItemTemplate</code> and <code>AddNewRowItemTemplate</code>

<code>AddNewRowEditorTemplate</code>

<code>EditorTemplate</code>

Here is my code:

MainWindow.xaml:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:ig="http://schemas.infragistics.com/xaml"
        Width="640" Height="480" >
    <Window.Resources>
        <DataTemplate x:Key="EditorTemplate">
            <TextBox Width="64"/>
        </DataTemplate>
        <DataTemplate x:Key="BoolEditorTemplate">
            <CheckBox/>
        </DataTemplate>
        <DataTemplate x:Key="DataTemplate">
            <ContentControl Content="{Binding }">
                <ContentControl.Style>
                    <Style TargetType="{x:Type ContentControl}">
                        <Setter Property="ContentTemplate" Value="{StaticResource EditorTemplate}" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Type}" Value="bool">
                                <Setter Property="ContentTemplate" Value="{StaticResource BoolEditorTemplate}" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </ContentControl.Style>
            </ContentControl>
        </DataTemplate>
    </Window.Resources>
    <ig:XamGrid ItemsSource="{Binding DataCollection, RelativeSource={RelativeSource AncestorType=Window}}"
                AutoGenerateColumns="False">
        <ig:XamGrid.EditingSettings>
            <ig:EditingSettings AllowEditing="Row" />
        </ig:XamGrid.EditingSettings>
        <ig:XamGrid.AddNewRowSettings>
            <ig:AddNewRowSettings AllowAddNewRow="Top" />
        </ig:XamGrid.AddNewRowSettings>

        <ig:XamGrid.Columns>
            <ig:TemplateColumn Key="Name"
                               ItemTemplate="{StaticResource DataTemplate}"
                               AddNewRowItemTemplate="{StaticResource DataTemplate}"
                               EditorTemplate="{StaticResource DataTemplate}"
                               AddNewRowEditorTemplate="{StaticResource DataTemplate}"/>
            <ig:TextColumn Key="Type"/>
        </ig:XamGrid.Columns>
    </ig:XamGrid>
</Window>

MainWindow.xaml.cs:

using System.Collections.ObjectModel;

namespace WpfApplication1
{
  public partial class MainWindow
  {
    public MainWindow()
    {
      InitializeComponent();
    }

    public ObservableCollection<Data> DataCollection { get; } = new ObservableCollection<Data>
    {
      new Data { Name = "Foo", Type = "bool" },
      new Data { Name = "Bar", Type = "enum" }
    };
  }

  public class Data
  {
    public string Name { get; set; }
    public string Type { get; set; }
  }
}

Solution

  • As explained here on the infragistics forum, for this use case not only is an EditorTemplate needed, but also an EditorStyle.

    <Style x:Key="EditorStyle" TargetType="{x:Type ContentControl}">
        <Setter Property="ContentTemplate" Value="{StaticResource EditorTemplate}" />
        <Style.Triggers>
            <DataTrigger Binding="{Binding Type}" Value="bool">
                <Setter Property="ContentTemplate" Value="{StaticResource BoolEditorTemplate}" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
    
    <DataTemplate x:Key="DataTemplate">
        <ContentControl Content="{Binding }"
                        Style="{StaticResource EditorStyle}" />>
    </DataTemplate>
    
    [...]
    
    <ig:TemplateColumn Key="Name"
                       ItemTemplate="{StaticResource DataTemplate}"
                       AddNewRowItemTemplate="{StaticResource DataTemplate}"
                       EditorTemplate="{StaticResource DataTemplate}"
                       AddNewRowEditorTemplate="{StaticResource DataTemplate}"
                       EditorStyle="{StaticResource EditorStyle}" />