Adding Strike-Through to a selected row in a ListView on button click
gridview, listview, text-decorations, wpf
Solution
You could modify this ListViewItem ControlTemplate Example and add a thin rectangle for striking through a whole list view item:
<ListView>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListViewItem">
<Grid>
<Border Name="Border" Padding="2" SnapsToDevicePixels="true" Background="Transparent">
<GridViewRowPresenter VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Border>
<Rectangle Name="StrikeThrough" HorizontalAlignment="Stretch" VerticalAlignment="Center"
Height="1" StrokeThickness="1" Stroke="Transparent"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="true">
<Setter TargetName="Border" Property="Background" Value="LightBlue"/>
<Setter TargetName="StrikeThrough" Property="Stroke" Value="Red"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
...
</ListView>
Problem
I'm trying to figure out how to strike through a selected row in my ListView when a button is pressed. There is a GridView inside with multiple columns. These columns are bound to fields in a class i have created which gets sent to an ObservableCollection which populates the data in my ListView. Preferably, after the button click, the entire selected row would have a red line though it, although at this point I would even be happy with just having each cell's text struck. I have tried all kinds of things. The closest I have gotten was that I was able to get the tooltip to show the text with a strike-through by changing the Notes field in my reservation class to a TextBlock and then adding a TextDecoration like this: ``` Reservation selected = (Reservation)shuttleView.SelectedItem; TextDecoration td = new TextDecoration(TextDecorationLocation.Strikethrough, new Pen(Brushes.Black, 1), 0, TextDecorationUnit.FontRecommended, TextDecorationUnit.FontRecommended); selected.Notes.TextDecorations.Add(td); ``` However, this would only put the decoration on the tooltip and not in the ListView... I have posted my listview and class below: ``` <ListView Height="287" HorizontalAlignment="Left" Margin="148,12,0,0" Name="shuttleView" VerticalAlignment="Top" Width="720" > <ListView.ItemContainerStyle> <Style TargetType="{x:Type ListViewItem}"> <Setter Property="ToolTip" Value="{Binding Notes}" /> </Style> </ListView.ItemContainerStyle> <ListView.View> <GridView> <GridViewColumn Width="50" Header="Time" DisplayMemberBinding="{Binding Time}" /> <GridViewColumn Width="50" Header="DO/PU" DisplayMemberBinding="{Binding DropPickup}" /> <GridViewColumn Width="100" Header="# People" DisplayMemberBinding="{Binding People}" /> <GridViewColumn Width="100" Header="Room #" DisplayMemberBinding="{Binding Room}" /> <GridViewColumn Width="100" Header="Hotel" DisplayMemberBinding="{Binding Hotel}" /> <GridViewColumn Width="112" Header="Location" DisplayMemberBinding="{Binding Location}" /> <GridViewColumn Width="198" Header="Notes" DisplayMemberBinding="{Binding Notes}" /> </GridView> </ListView.View> </ListView> class Reservation { public string ResID { get; set; } public string Time { get; set; } public string DropPickup { get; set; } public string People { get; set; } public string Room { get; set; } public string Hotel { get; set; } public string Location { get; set; } public string Notes { get; set; } public Reservation(string ResID, string Time, string DropPickup, string People, string Room, string Hotel, string Location, string Notes) { this.ResID = ResID; this.Time = Time; this.DropPickup = DropPickup; this.People = People; this.Room = Room; this.Hotel = Hotel; this.Location = Location; this.Notes = Notes; } } ```