0

我有一个包含两列的 XamGrid,Name并且Type. 根据Type,我想为 提供不同类型的列Name,因此我使用的是TemplateColumn. 在数据模板中,我有ContentControl一个默认值ContentTemplate和一个如果是特定值DataTrigger,则将其设置ContentTemplate为不同的列样式。Type我正在为此数据模板设置所有四个模板( ItemTemplate, EditorTemplate, AddNewRowItemTemplate, AddNewRowEditorTemplate) 。TemplateColumn

ItemTemplateAddNewRowItemTemplate并按AddNewRowEditorTemplate预期工作,但EditorTemplate没有,请参阅附图:

<code>ItemTemplate</code> 和 <code>AddNewRowItemTemplate</code>

<code>AddNewRowEditorTemplate</code>

<code>EditorTemplate</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; }
  }
}
4

1 回答 1

0

正如在基础设施论坛上解释的那样,对于这个用例,不仅是EditorTemplate必需的,而且是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}" />
于 2017-06-01T11:05:31.253 回答