WPF GridView列和基于数据值的动态单元模板

时间:2016-02-23 12:41:09

标签: wpf gridviewcolumn celltemplate

我有一个GridView,我可以根据配置设置在运行时生成列。例如 文本列=显示其中的文本 Image Column =在那里显示图形。

但问题是整个列都会显示其中任何一个类型。 我想要做的是基于我想要的特定细胞的数据 (a)选择动态模板 (b)动态(理想地)将内容呈现为FrameworkElement,并使用该内容设置单元格内容。

这意味着每个单元格可以显示文本或图像。所以在第一行中,第一列可以是文本,第二列可以是基于数据值的图形。

有没有办法根据特定单元格的运行时内容值选择模板,还是完全渲染UIElement然后设置为单元格的值?

实施例: -

单元数据= <bold>Hello. I'm bold</bold> =&gt;将文本显示为粗体(TextBlock元素)

单元数据= <img>test.png</img> =&gt;显示图形(图像元素)

1 个答案:

答案 0 :(得分:0)

您可以使用Triggers

实现此目的

以下是示例代码。 。

 <ListView Margin="10" Name="lvUsers">
    <ListView.View>
        <GridView x:Name="gridview">
            <GridViewColumn Header="Type">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <ContentControl>
                            <ContentControl.Style>
                                <Style TargetType="{x:Type ContentControl}">
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding IsImage}" Value="True">
                                            <Setter Property="ContentTemplate">
                                                <Setter.Value>                                                        
                                                    <DataTemplate>
                                                        <TextBlock Text="Text goes here"
                                                    Foreground="Red"/>
                                                    </DataTemplate>
                                                </Setter.Value>
                                            </Setter>
                                        </DataTrigger>

                                        <DataTrigger Binding="{Binding IsImage}" Value="False">
                                            <Setter Property="ContentTemplate">
                                                <Setter.Value>
                                                    <DataTemplate>
                                                        <TextBlock Text="Image goes here"/>
                                                        <!--<Image Source="{Binding source}" />-->
                                                    </DataTemplate>
                                                </Setter.Value>
                                            </Setter>
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </ContentControl.Style>
                        </ContentControl>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>

        </GridView>
    </ListView.View>
</ListView>

示例后端代码

public partial class MainWindow : Window
{       

    public MainWindow()
    {
        InitializeComponent();
        List<myClass> mc = new List<myClass>();
        mc.Add(new myClass() { Itemsource = "textblock text", IsImage = false });
        mc.Add(new myClass() { Itemsource = "Image source", IsImage = true });
        lvUsers.ItemsSource = mc;
    }     
}

class myClass
{
    public string Itemsource { get; set; }
    public bool IsImage { get; set; }

}