我创建了一个从列表填充的数据网格。列表实现是这样的。
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
部分。我尝试使用ControlTemplate
和TextBox
控件创建一个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"/>
答案 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>
没有模板的概念。
还请注意,您仍然需要定义两个单独的数据模板,因为它们中的绑定路径不同。