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

Original source