从DataGridColumn中的资源使用ControlTemplate

时间:2019-06-13 13:54:04

标签: wpf

我创建了一个从列表填充的数据网格。列表实现是这样的。

ObservableCollection<CFImportResult> CFImportResults
public class CFImportResult
{
    public string CFComponentName { get; set; }
    public string CFport { get; set; }
    public PortType CFPortType { get; set; }
    public string PlatformCompName { get; set; }
    public string PlatformCompPort { get; set; }
    public PortType PlatformCompType { get; set; }
    public string Result { get; set; }
}

这两个网格列很特殊,它们同时显示图像和文本。 XAML在下面给出。

<DataGrid ItemsSource="{Binding Path=CFImportResults}" Height="500" AutoGenerateColumns="False" CanUserAddRows="False" VerticalAlignment="Top" Background="Transparent" VerticalScrollBarVisibility="Auto" BorderBrush="Gray">
    <DataGrid.Columns>
        <DataGridTextColumn Header="CF Component" Binding="{Binding Path=CFComponentName}" Width="140"/>
        <DataGridTemplateColumn Header="CF port" Width="140">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Image Height="16" Width="16" Source="{Binding CFPortIcon}"/>
                        <TextBox Text="{Binding CFport}" BorderBrush="Transparent"/>
                    </StackPanel>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTextColumn Header="Platform Component" Binding="{Binding Path=PlatformCompName}" Width="140"/>
        <DataGridTemplateColumn Header="Platform port" Width="140">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Image Height="16" Width="16" Source="{Binding PlatformCompIcon}"/>
                        <TextBox Text="{Binding PlatformCompPort}" BorderBrush="Transparent"/>
                    </StackPanel>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTextColumn Header="Status" Binding="{Binding Path=Result}" Width="140"/>
    </DataGrid.Columns>
</DataGrid>

这很好。现在,我想将DataTemplate部分移到ResourceDictionary部分。我尝试使用ControlTemplateTextBox控件创建一个Image。但是我不知道如何在DataGridTextColumn中使用它(它没有任何ItemSource字段)。这真的有可能吗?

<ResourceDictionary>
    <ControlTemplate x:Key="PortTemplate" TargetType="{x:Type DataGridCell}">
        <StackPanel Orientation="Horizontal">
            <Image Height="16" Width="16" Source="{Binding CFPortIcon}"/>
            <TextBox Text="{Binding CFport}" BorderBrush="Transparent"/>
        </StackPanel>
    </ControlTemplate>
</ResourceDictionary>

 <DataGridTextColumn Header="CF port" ????="{StaticResource PortTemplate}" Width="140"/>

1 个答案:

答案 0 :(得分:1)

DataTemplates移至ResourceDictionary并给他们x:Key

<DataTemplate x:Key="a">
    <StackPanel Orientation="Horizontal">
        <Image Height="16" Width="16" Source="{Binding CFPortIcon}"/>
        <TextBox Text="{Binding CFport}" BorderBrush="Transparent"/>
    </StackPanel>
</DataTemplate>
<DataTemplate x:Key="b">
    <StackPanel Orientation="Horizontal">
        <Image Height="16" Width="16" Source="{Binding PlatformCompIcon}"/>
        <TextBox Text="{Binding PlatformCompPort}" BorderBrush="Transparent"/>
    </StackPanel>
</DataTemplate>

然后您可以使用CellStyle标记扩展名来设置DataGridTemplateColumns的{​​{1}}属性,如下所示:

StaticResource

尽管<DataGrid ItemsSource="{Binding Path=CFImportResults}" Height="500" AutoGenerateColumns="False" CanUserAddRows="False" VerticalAlignment="Top" Background="Transparent" VerticalScrollBarVisibility="Auto" BorderBrush="Gray"> <DataGrid.Columns> <DataGridTextColumn Header="CF Component" Binding="{Binding Path=CFComponentName}" Width="140"/> <DataGridTemplateColumn Header="CF port" Width="140" CellStyle="{StaticResource a}" /> <DataGridTextColumn Header="Platform Component" Binding="{Binding Path=PlatformCompName}" Width="140"/> <DataGridTemplateColumn Header="Platform port" Width="140" CellStyle="{StaticResource b}" /> <DataGridTextColumn Header="Status" Binding="{Binding Path=Result}" Width="140"/> </DataGrid.Columns> </DataGrid> 没有模板的概念。

还请注意,您仍然需要定义两个单独的数据模板,因为它们中的绑定路径不同。