I need to combine more than one text and I want to show new text partially different style by condition.
For instance,
I have a datatable with columns (code,opt1,std1,opt2,std2,opt3,std3,opt4,std4). I want to combine code,opt1,opt2,opt3 and opt4 row values in configuration column of datagrid.
But also I want to show opt1 value (in configuration) bold, italic and underline if std1 is true; I want to show opt2 value (in configuration) bold, italic and underline if std2 is true; I want to show opt3 value (in configuration) bold, italic and underline if std3 is true; I want to show opt4 value (in configuration) bold, italic and underline if std4 is true.
my xaml code like that:
<Grid>
<DataGrid x:Name="grid1" ItemsSource="{Binding Items}" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" CanUserSortColumns="True" CanUserAddRows="False" AutoGenerateColumns="False" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding code}" Header="code" />
<DataGridTemplateColumn Header="configuration" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=code}"/>
<TextBlock Text=" - "/>
<TextBlock Text="{Binding Path=opt1}">
//How to use Style and Trigger here?
</TextBlock>
<TextBlock Text=" - "/>
<TextBlock Text="{Binding Path=opt2}">
//How to use Style and Trigger here?
</TextBlock>
<TextBlock Text=" - "/>
<TextBlock Text="{Binding Path=opt3}">
//How to use Style and Trigger here?
</TextBlock>
<TextBlock Text=" - "/>
<TextBlock Text="{Binding Path=opt4}">
//How to use Style and Trigger here?
</TextBlock>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Binding="{Binding opt1}" Header="opt1" />
<DataGridCheckBoxColumn Binding="{Binding std1}" Header="std1" />
<DataGridTextColumn Binding="{Binding opt2}" Header="opt2" />
<DataGridCheckBoxColumn Binding="{Binding std2}" Header="std2" />
<DataGridTextColumn Binding="{Binding opt3}" Header="opt3" />
<DataGridCheckBoxColumn Binding="{Binding std3}" Header="std3" />
<DataGridTextColumn Binding="{Binding opt4}" Header="opt4" />
<DataGridCheckBoxColumn Binding="{Binding std4}" Header="std4" />
</DataGrid.Columns>
</DataGrid>
</Grid>
and C# codes like that:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataTable optionalPro = new DataTable();
optionalPro.Columns.Add("code", typeof(string));
optionalPro.Columns.Add("opt1", typeof(string));
optionalPro.Columns.Add("std1", typeof(byte));
optionalPro.Columns.Add("opt2", typeof(string));
optionalPro.Columns.Add("std2", typeof(byte));
optionalPro.Columns.Add("opt3", typeof(string));
optionalPro.Columns.Add("std3", typeof(byte));
optionalPro.Columns.Add("opt4", typeof(string));
optionalPro.Columns.Add("std4", typeof(byte));
optionalPro.Rows.Add("A01", "Option_ABC",false, "Option_ADB", true, "Option_CAF", true, "Option_ASD", false);
optionalPro.Rows.Add("A02", "Option_AXC",true, "Option_ADB", true, "Option_CAD", false, "Option_AWD", false);
optionalPro.Rows.Add("A03", "Option_AXC",true, "Option_SWD", false, "Option_ZAS", true, "Option_YHL", true);
optionalPro.Rows.Add("A04", "Option_AAZ",false, "Option_MNK", true, "Option_DHG", true, "Option_AFL", false);
optionalPro.Rows.Add("A05", "Option_CDE",true, "Option_KLM", true, "Option_SLH", false, "Option_AXD", true);
optionalPro.Rows.Add("A06", "Option_HGF",false, "Option_SSD", false, "Option_CQL", false, "Option_KHG", true);
grid1.ItemsSource = optionalPro.DefaultView;
}
}
As a result, I see that screen:
but I want to show configuration column like that:
you need a regular Style for TextBlock with setter for FontWeight, FontStyle and TextDecorations.
apply it in CellTemplate using StaticResource
DataTrigger binds to Tag property in order to reuse it, since each TextBlock uses different std
property. In CellTemplate each TextBlock has additional Tag binding.
DataTrigger Value is 1
because std
columns are defined with byte
type: true gets conveted to 1, false - to 0
<DataGrid>
<DataGrid.Resources>
<Style TargetType="TextBlock" x:Key="cfgText">
<Style.Triggers>
<DataTrigger Binding="{Binding Tag, RelativeSource={RelativeSource Self}}" Value="1">
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="FontStyle" Value="Italic"/>
<Setter Property="TextDecorations" Value="Underline"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding code}" Header="code" />
<DataGridTemplateColumn Header="configuration" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=code}"/>
<TextBlock Text=" - "/>
<TextBlock Text="{Binding Path=opt1}" Tag="{Binding Path=std1}" Style="{StaticResource cfgText}"/>
<TextBlock Text=" - "/>
<TextBlock Text="{Binding Path=opt2}" Tag="{Binding Path=std2}" Style="{StaticResource cfgText}"/>
<TextBlock Text=" - "/>
<TextBlock Text="{Binding Path=opt3}" Tag="{Binding Path=std3}" Style="{StaticResource cfgText}"/>
<TextBlock Text=" - "/>
<TextBlock Text="{Binding Path=opt4}" Tag="{Binding Path=std4}" Style="{StaticResource cfgText}"/>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Binding="{Binding opt1}" Header="opt1" />
<DataGridCheckBoxColumn Binding="{Binding std1}" Header="std1" />
<DataGridTextColumn Binding="{Binding opt2}" Header="opt2" />
<DataGridCheckBoxColumn Binding="{Binding std2}" Header="std2" />
<DataGridTextColumn Binding="{Binding opt3}" Header="opt3" />
<DataGridCheckBoxColumn Binding="{Binding std3}" Header="std3" />
<DataGridTextColumn Binding="{Binding opt4}" Header="opt4" />
<DataGridCheckBoxColumn Binding="{Binding std4}" Header="std4" />
</DataGrid.Columns>
</DataGrid>