【问题标题】:WPF GridView Column and dynamic cell template based upon data valueWPF GridView Column和基于数据值的动态单元格模板
【发布时间】:2016-06-05 07:25:45
【问题描述】:

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

但问题是整个列将显示它们中的任何一种类型。 我想要做的是基于特定单元格的数据,我想要 (a) 选择动态模板 (b) 将内容动态(理想情况下)渲染为 FrameworkElement 并使用它设置单元格内容。

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

有没有办法根据特定单元格的运行时内容值选择模板或完全呈现 UIElement 然后设置为单元格的值?

例子:-

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

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

【问题讨论】:

    标签: wpf gridviewcolumn celltemplate


    【解决方案1】:

    您可以通过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; }
    
    }
    

    【讨论】:

    • 您好 GopicHandar,感谢您的回复,但我没有单独的类型属性。我只有一个字符串类型的属性,实际数据在哪里,我需要根据该字符串文本呈现内容。
    • @Abdullah 有没有办法区分这两个属性(图像和文本)?如果可能,请分享代码。
    猜你喜欢
    • 2013-04-04
    • 2012-11-02
    • 1970-01-01
    • 2020-05-02
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多