2013-03-05 170 views
1

如何更改列表視圖中項目的前景(即使背景將執行)。 我有一個程序打開Excel並檢查給定工作表中的損壞鏈接。 我想向用戶顯示給定鏈接的列表,而且這個列表已被破壞。我想改變前景到紅色。 我已將值綁定到observablecollection。收藏是一個字符串(Web鏈接)只是收集和工作正常WPF:更改列表視圖項的背景顏色

應該怎麼做多結合樣here

編輯: - 這個 多救一個問題。創建財產並進行所有更改後。 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> 

我不知道我是否應該發佈完整的代碼。但這裏是我的班級 按鈕點擊將啓動程序。

我的類代碼: -

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 
+0

就是 「strPdfLst」 一個ObservableCollection或只是一個列表? – makim 2013-03-05 10:09:05

+0

它是ObservableCollection – 2013-03-05 10:25:44

+0

好吧,你是否已經將DataContext設置爲包含「strPdfLst」的對象? – makim 2013-03-05 10:28:05

回答

7

這是從工作中

<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> 
0

首先創建可綁定到,然後就創建一個樣式與上破,物業一個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> 

未測試此代碼,但它應該工作!

+0

我對此還有一個問題。創建財產並進行所有更改後。 WPF表單沒有得到值的更新。即列表框未被填充。沒有着色發生(不確定它也發生了,因爲我不能看到它們)。 – 2013-03-05 09:49:40

+0

你能不能更新你的問題,並分享更多的代碼不僅僅是xaml,我需要看你的代碼隱藏多說! – makim 2013-03-05 09:52:38

1

創建一個以鏈接爲參數併發送背景/前景顏色的轉換器,轉換器檢查鏈接並相應地發送正確的代碼,將顏色代碼綁定到itemtemplate background/foreground屬性。