我有一个GridView,我可以根据配置设置在运行时生成列。例如 文本列=显示其中的文本 Image Column =在那里显示图形。
但问题是整个列都会显示其中任何一个类型。 我想要做的是基于我想要的特定细胞的数据 (a)选择动态模板 (b)动态(理想地)将内容呈现为FrameworkElement,并使用该内容设置单元格内容。
这意味着每个单元格可以显示文本或图像。所以在第一行中,第一列可以是文本,第二列可以是基于数据值的图形。
有没有办法根据特定单元格的运行时内容值选择模板,还是完全渲染UIElement然后设置为单元格的值?
实施例: -
单元数据= <bold>Hello. I'm bold</bold>
=&gt;将文本显示为粗体(TextBlock元素)
单元数据= <img>test.png</img>
=&gt;显示图形(图像元素)
答案 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; }
}