【问题标题】:Defining a Silverlight column derived from DataGridTemplateColumn定义从 DataGridTemplateColumn 派生的 Silverlight 列
【发布时间】:2010-02-16 23:58:35
【问题描述】:

我正在学习 Silverlight(从零开始,我在这里感觉有点像离水的鱼!)。我正在查看 DataGrid 类,并且正在使用列和列标题的自定义模板。

我想显示一个网格,该网格包含一组列,这些列在标题中有一个小图像(每列有不同的图像),并且在单元格中只显示值,每列的值绑定到不同的属性在绑定数据上。

我已经阅读了一些内容,并通过下面的 xaml 将其用于一列。我想要做的是将此列捆绑到某种可重用的列中,然后在我的网格中添加它们的多个实例,指定值来定义要使用的图像和绑定的属性。

有人可以帮我提些建议吗?顺便说一句,我正在使用 Silverlight 3.0。

这是我用于一列的 xaml:

<data:DataGrid x:Name="_bidGrid" IsReadOnly="true" CanUserResizeColumns="False">
    <data:DataGrid.Columns>
        <data:DataGridTemplateColumn>
            <data:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding <bound property name goes here>}"/>
                </DataTemplate>
            </data:DataGridTemplateColumn.CellTemplate>
            <data:DataGridTemplateColumn.HeaderStyle>
                <Style TargetType="dataprimitives:DataGridColumnHeader">
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <Image Source="<image url goes here>"/>
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </data:DataGridTemplateColumn.HeaderStyle>
        </data:DataGridTemplateColumn>
    </data:DataGrid.Columns>
</data:DataGrid>

【问题讨论】:

    标签: silverlight xaml


    【解决方案1】:

    将实际的 col 捆绑到一个样式中意味着您将为网格中的每个 col 拥有相同的图像,您可以为每个 diff col 标题定义一个样式,然后当您定义您的 cols 时,您可以引用该样式,例如:

    <data:DataGridTemplateColumn HeaderStyle="{StaticResource ProductNameColHeadStyle}"
    

    下面的完整 XAML 更好地说明了这一点,将其复制到新的 SL 项目 MainPage.xaml 并运行以查看结果...

    <UserControl x:Class="SilverlightApplication1.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    
    
        xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" 
        xmlns:chartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit" 
        xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
        xmlns:System_Windows_Controls_Primitives="clr-namespace:System.Windows.Controls.Primitives;assembly=System.Windows.Controls" 
        xmlns:visualizationToolkit="clr-namespace:System.Windows.Controls.DataVisualization;assembly=System.Windows.Controls.DataVisualization.Toolkit"
        xmlns:System_Windows_Controls_DataVisualization_Charting_Primitives="clr-namespace:System.Windows.Controls.DataVisualization.Charting.Primitives;assembly=System.Windows.Controls.DataVisualization.Toolkit" 
        xmlns:inputToolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input.Toolkit" 
        xmlns:dataPrimitives="clr-namespace:System.Windows.Controls.Primitives;assembly=System.Windows.Controls.Data"             
        mc:Ignorable="d" Width="400" Height="300">
    
        <Grid x:Name="LayoutRoot" Background="White">
    
            <Grid.Resources> 
    
                <Style x:Key="ProductNameColHeadStyle"  TargetType="dataPrimitives:DataGridColumnHeader">
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <TextBlock Text="prod name image goes here"/>
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
    
                <Style x:Key="ProductDescColHeadStyle"  TargetType="dataPrimitives:DataGridColumnHeader">
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <TextBlock Text="prod description image goes here"/>
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
    
            </Grid.Resources>
    
    
    
    
            <data:DataGrid Name="dta" AutoGenerateColumns="False" >
    
                <data:DataGrid.Columns>
    
                    <data:DataGridTemplateColumn HeaderStyle="{StaticResource ProductNameColHeadStyle}">                    
                        <data:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="Binding to prod name here"></TextBlock>
                            </DataTemplate>
                        </data:DataGridTemplateColumn.CellTemplate>                    
                    </data:DataGridTemplateColumn>
    
                    <data:DataGridTemplateColumn HeaderStyle="{StaticResource ProductDescColHeadStyle}">
                        <data:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="Binding to prod desc here"></TextBlock>
                            </DataTemplate>
                        </data:DataGridTemplateColumn.CellTemplate>
                    </data:DataGridTemplateColumn>
    
                </data:DataGrid.Columns>   
    
            </data:DataGrid>
    
        </Grid>
    
    
    </UserControl>
    

    【讨论】:

    • 感谢您的回复。我希望通过某种方式在一个 XAML 包中参数化图像 url 和列绑定。我有 5 个我想使用的这种类型的列,因此它将导致 5 个样式和 5 个模板列,除了 url 和列绑定之外,它们看起来都非常相似。我想我可以编写一个派生自 DataGridTemplateColumn 的类,并在 C# 中设置标题样式和绑定,为 url 和绑定提供类的属性。但我希望能够使用 XAML 来做到这一点。
    • No probs Niall,我知道你从哪里来。你最终会得到很多样式\大量的 XAML,我发现当我第一次开始做 SL\WPF 时,我想只要定义XAML 中的 5 种样式并且不必太担心 XAML 的数量,您甚至可以将样式移到 app.xaml 中,然后至少它们不会弄乱您的 usercontrol.xaml 并且它们将在其他屏幕上可用.如果您要添加动态列或有更多列,那么派生类可能会更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 2011-06-11
    • 2014-08-29
    相关资源
    最近更新 更多