WPF:更改列表视图项的背景颜色

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/15219347/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-13 07:52:49  来源:igfitidea点击:

WPF:change background color of listview item

wpfdata-bindingvb.net-2010

提问by manu vishwanath

how to change the foreground(even Background will do) of item in listview. i have a program which opens excel and check for broken links in the given sheet. i want to display the user the list of given links and whcih ever is broken. i want to change foreground to RED. i have bound the values to observablecollection. the collection is just collection of strings(WEB LINKS) and is working fine

如何更改列表视图中项目的前景(甚至背景也可以)。我有一个程序可以打开excel并检查给定工作表中的断开链接。我想向用户显示给定链接的列表,并且曾经被破坏过。我想将前景更改为红色。我已将值绑定到 observablecollection。该集合只是字符串的集合(网络链接)并且工作正常

should i do multi binding like here

我应该像这里一样进行多重绑定吗

EDIT:-have got one more problem on this. after creating the property and making all the changes. the WPF form is not getting updated with the values. i.e. the list box is not getting filled. neither the coloring is happening( not sure it is happening also. as i cant see them).

编辑:-对此还有一个问题。创建属性并进行所有更改后。WPF 表单未随值更新。即列表框没有被填满。着色都没有发生(不确定它是否也在发生。因为我看不到它们)。

here is my code. please excuse my coding i am new to WPF

这是我的代码。请原谅我的编码我是 WPF 的新手

<Window x:Class="URLValide.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:Local="clr-namespace:URL_Validater.URLValide"
Title="URL Validator" Height="269" Width="525" FontSize="13"
ResizeMode="NoResize">

<Window.Resources>
    <ResourceDictionary>
        <Style x:Key="HighLight" TargetType="{x:Type Control}">
            <Setter Property="Background" Value="Honeydew"/>
            <Setter Property="FontWeight" Value="UltraBlack"/>
            <Style.Triggers>
                <Trigger Property="IsFocused" Value="True">
                    <Setter Property="Effect">
                        <Setter.Value>
                            <DropShadowEffect BlurRadius="40" Color="Beige" Direction="50" Opacity="0.5"/>                                
                        </Setter.Value>
                    </Setter>
                    <Setter Property="Background" Value="White"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ResourceDictionary>
</Window.Resources>

<DockPanel LastChildFill="True">
    <Label DockPanel.Dock="Top" Name="WinHeader"  Height="30" Background="BurlyWood" FontFamily="Calibri" FontSize="20" FontWeight="Bold" FontStretch="Medium" VerticalAlignment="Top" HorizontalAlignment="Stretch" Margin="0,0,0,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Top">URL Validator</Label>
    <Grid DockPanel.Dock="Bottom" Background="Beige">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="auto"/>
            <ColumnDefinition Width="auto"/>
            <ColumnDefinition Width="auto"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="20" MaxHeight="30"/>
        </Grid.RowDefinitions>
        <TextBlock Grid.Column="0" Text="Current URL:"></TextBlock>
        <TextBlock Grid.Column="1"  Text="{Binding strCrnUrl}"  Width="370"></TextBlock>
        <TextBlock Grid.Column="2"  Text="10 of 100" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
    </Grid>
    <Grid DockPanel.Dock="Right" Width="154">
        <Grid.ColumnDefinitions>
            <ColumnDefinition MaxWidth="300" Width="19*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition MaxHeight="55" MinHeight="10" Height="35*" />
            <RowDefinition Height="165*"  MinHeight="10"  />
        </Grid.RowDefinitions>

        <Label Name="LbleRight" BorderBrush="Black" BorderThickness="1" Margin="0,2" FontSize="13" Content="List Of URL's" Height="30" Grid.ColumnSpan="2" Grid.Row="0"></Label>
        <ListView Grid.Row="1" Background="Azure" ItemsSource="{Binding strPdfLst}" IsEnabled="True" Margin="0,0,0,1"></ListView>            
    </Grid>

    <Grid DockPanel.Dock="Left">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="30*" />
            <RowDefinition Height="60*" />                
        </Grid.RowDefinitions>            
        <Label BorderBrush="Black" Name="lblFleSel" BorderThickness="1" Height="27" Margin="2,2,0,30" HorizontalAlignment="Left" Width="349">Select File To which Contains the list of URL's:</Label>
        <TextBox Name="txtbxFleNme" BorderBrush="Black" BorderThickness="1" Margin="2,34,0,0" Style="{StaticResource ResourceKey=HighLight}" HorizontalAlignment="Left" Width="272"></TextBox>
        <Button Name="btnFleSlec" Width="69" Height="27" Content="Browse" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="276,32,4,0"></Button>
        <Grid Grid.Row="1" Height="118" HorizontalAlignment="Left" Margin="0,1,0,0" Name="OptionGrid" VerticalAlignment="Top" Grid.RowSpan="2">
            <StackPanel HorizontalAlignment="Left" VerticalAlignment="Top" Orientation="Horizontal">
                <Border BorderBrush="Black" BorderThickness="1" Height="117" Margin="3,1,0,0" HorizontalAlignment="Stretch" Width="350">
                    <!--<StackPanel HorizontalAlignment="Left" VerticalAlignment="Top" Width="162" Height="118">                        
                    </StackPanel>-->
                    <Grid Height="auto" HorizontalAlignment="Stretch" Width="335">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="10*"/>
                            <RowDefinition Height="10*"/>
                            <RowDefinition Height="10*"/>
                            <RowDefinition Height="10*"/>
                            <RowDefinition Height="10*"/>
                        </Grid.RowDefinitions>
                        <CheckBox Name="chkboxHas" VerticalAlignment="Center" HorizontalAlignment="Center">Has Column Headers</CheckBox>
                        <Label Name="lblDesc" Height="auto" Margin="0,0,204,0" Grid.Row="1" HorizontalContentAlignment="Right" VerticalAlignment="Top">Description Column:</Label>
                        <ComboBox Grid.Row="1" Name="cmboxDescol"  Margin="131,0,0,0" Style="{StaticResource ResourceKey=HighLight}"></ComboBox>
                        <Label Name="lblUrlCol" Height="auto" Grid.Row="2" Margin="0,0,204,0" HorizontalContentAlignment="Right">URL's Column:</Label>
                        <ComboBox Name="cmboxUrlCol" Grid.Row="2" Margin="131,0,0,0" Style="{StaticResource ResourceKey=HighLight}"></ComboBox>
                        <Label Name="lblResCol" Height="auto" Grid.Row="3" Margin="0,0,196,0" HorizontalContentAlignment="Right">Result Column:</Label>
                        <ComboBox Name="cmboxResCol" Grid.Row="3" Margin="131,0,0,0" Style="{StaticResource ResourceKey=HighLight}"></ComboBox>
                        <Button Grid.Row="4" HorizontalAlignment="Center" VerticalAlignment="Center" Content="Validate URL links" Name="btnValidate"></Button>
                    </Grid>
                </Border>                    
            </StackPanel>
        </Grid>
    </Grid>
</DockPanel>

i am not sure if i should be posting full code. but here is my class the button click will start the program.

我不确定我是否应该发布完整的代码。但这是我的课程,单击按钮将启动程序。

My class code:-

我的课程代码:-

    Imports Microsoft
Imports System
Imports System.Net
Imports System.Data
Imports System.Windows
Imports System.Windows.Forms
Imports Excel = Microsoft.Office.Interop.Excel
Imports System.Collections.ObjectModel
Imports System.ComponentModel

Namespace URLValide

    Public Class clsUrlCheck
        Implements INotifyPropertyChanged

        Public Event propertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged

        Public exclApplic As New Excel.Application
        Public exclWkbOpe As Excel.Workbook
        Public exclWksAct As Excel.Worksheet
        Public exclRngUrl As Excel.Range
        Public exclRngDes As Excel.Range
        Public exclRngOut As Excel.Range
        Public intMaxRow As Long
        Public intCrtRow As Long
        Private _strTotlOf As String
        Private _strCrnUrl As String
        Private _ColorIndx As String
        Private _strPdfLst As ObservableCollection(Of String)
        Private _strhdrPdf As ObservableCollection(Of String)

#Region "Region of poperties"
        Public Property strTotlOf() As String
            Get
                Return _strTotlOf
            End Get
            Set(ByVal value As String)
                _strTotlOf = value
                Me.OnPropertyChanged("strTotlOf")
            End Set
        End Property

        Public Property strCrnUrl() As String
            Get
                Return _strCrnUrl
            End Get
            Set(ByVal value As String)
                _strCrnUrl = value
                Me.OnPropertyChanged("strCrnUrl")
            End Set
        End Property

        Public Property strPdfLst As ObservableCollection(Of String)
            Get
                Return _strPdfLst
            End Get
            Set(ByVal value As ObservableCollection(Of String))
                _strPdfLst = value
                Me.OnPropertyChanged("strPdfLst")
            End Set
        End Property

        Public Property strhdrPdf As ObservableCollection(Of String)
            Get
                Return _strhdrPdf
            End Get
            Set(ByVal value As ObservableCollection(Of String))
                _strhdrPdf = value
                Me.OnPropertyChanged("strhdrPdf")
            End Set
        End Property

        Public Property ColorIndx As String
            Get
                Return _ColorIndx
            End Get
            Set(ByVal value As String)
                _ColorIndx = value
                Me.OnPropertyChanged("ColorIndx")
            End Set
        End Property

        Private Sub OnPropertyChanged(ByVal propertyName As String)
            RaiseEvent propertyChanged(Me, New PropertyChangedEventArgs(propertyName))
        End Sub
#End Region

#Region "function of Validating the URL's"
        Public Function UrlCheck(ByVal strUrlReq As String)

            Try

                Dim WebReq As Net.HttpWebRequest = Net.HttpWebRequest.Create(strUrlReq)
                WebReq.Method = "Head"
                WebReq.Timeout = 5000
                Using Response = WebReq.GetResponse()
                    Return True
                End Using

            Catch ex As Exception
                ColorIndx = "True"
                Return False

            End Try

        End Function
#End Region

#Region "Start Function"
        Sub suStart()
            Dim blnValid As Boolean


            'strPdfLst.Clear()
            'strPdfLst = makeList(exclRngUrl.Column, False)
            If exclRngDes.Value = "Make Desc" Then
                strPdfLst = makeList(exclRngUrl.Column, True)
                exclRngDes.Delete()
            Else
                strPdfLst = makeList(exclRngUrl.Column, False)
            End If

            For Each exclRngEch As Excel.Range In exclRngUrl
                strCrnUrl = exclRngEch.Text
                strTotlOf = exclRngEch.Row & "OF" & intMaxRow
                blnValid = UrlCheck(exclRngEch.Value.ToString)
                If blnValid Then
                    exclWksAct.Cells(exclRngEch.Row, exclRngOut.Column).value = "Web Page Present"
                Else
                    exclWksAct.Cells(exclRngEch.Row, exclRngOut.Column).value = "Web Page Error"

                End If

            Next


        End Sub

        Function makeList(ByVal intColNum As Long, ByVal blnMkeStr As Boolean) As ObservableCollection(Of String)

            Dim ObsColTem As ObservableCollection(Of String) = New ObservableCollection(Of String)

            If Not blnMkeStr Then
                For intLopCnt As Int32 = intCrtRow To intMaxRow
                    ObsColTem.Add(exclWksAct.Cells(intLopCnt, intColNum).Text)
                Next
            Else
                For intLopCnt As Int32 = intCrtRow To intMaxRow
                    Dim strDesc As String = Mid(exclWksAct.Cells(intLopCnt, intColNum).Text, InStrRev(exclWksAct.Cells(intLopCnt, intColNum).Text, "/", , CompareMethod.Text) + 1)
                    ObsColTem.Add(strDesc)
                Next
            End If
            Return ObsColTem
        End Function
#End Region

    End Class
End Namespace

回答by paparazzo

This is from working code

这是来自工作代码

<ListView.ItemContainerStyle>
    <Style TargetType="ListViewItem">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=RowSelected}" Value="True">
                <Setter Property="Background" Value="Gainsboro"  />
                <Setter Property="FontWeight" Value="Bold" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</ListView.ItemContainerStyle>

回答by Syed Waqas

create a converter which takes the link as parameter and send the background/foreground color, the converters checks the link and sends the correct code accordingly,bind the color code to the itemtemplate background/foreground property.

创建一个以链接为参数并发送背景/前景颜色的转换器,转换器检查链接并相应地发送正确的代码,将颜色代码绑定到 itemtemplate 背景/前景属性。

回答by makim

First create a Broken-Property which you can bind to and then just create a Style for ListViewItems with a DataTrigger on the Broken-Property!

首先创建一个可以绑定到的 Broken-Property,然后在 Broken-Property 上创建一个带有 DataTrigger 的 ListViewItems 样式!

<Style TargetType="{x:Type ListViewItem}">
<Style.Triggers>
            <DataTrigger Binding="{Binding Broken}" Value="True">
                <Setter Property="Background" Value="Red"/>
                <Setter Property="Foreground" Value="White"/>
            </DataTrigger>
</Style.Triggers>
</Style>

Have not tested this code but it should work!

尚未测试此代码,但它应该可以工作!