1

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

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

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

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

例子:-

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

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

4

1 回答 1

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; }

}
于 2016-02-23T13:38:54.277 回答