2011-03-30 103 views
1

我一直在尋找相當長的時間如何做到這一點。我不知道如何設置使用代碼在GridView(WPF)的行項目的顏色,我不想在XAML通過代碼設置WPF中的GridView顏色通過代碼

我的數據來自我裝&拉開一個XML文件的示例。然後,我將它放入一個帶有屬性的小類中,並將這些類綁定到列以填充數據。稍後,它可以在表格的數據上開始一些功能。因爲這需要超過10分鐘的時間它在一個線程上&我想根據結果顏色我已完成解析的行。 (IE:紅色爲HTTP錯誤,橙色的XML解析錯誤等...)

這是GridView的XAML:

<ListView Name="RepoListView" Margin="0,22,0,0"> 
    <ListView.View> 
    <GridView AllowsColumnReorder="True"> 
     <GridViewColumn Header="Title" DisplayMemberBinding="{Binding title}" /> 
     <GridViewColumn Header="URL" DisplayMemberBinding="{Binding url}" /> 
     <GridViewColumn Header="Subscriptions" DisplayMemberBinding="{Binding dlc}" /> 
    </GridView> 
    </ListView.View> 
</ListView> 

我再解析使用URL欄的數據。我目前正在更改所選項目。我想知道如果我能做些改變特定項目的東西。假設我在500行上:

我使用:setSelected(i)它使用Dispatcher安全地更改選定的行。我還有什麼可以改變顏色的嗎?我一直在努力尋找解決方案。

謝謝

回答

3

我可能會去綁定的方法,後面的代碼是醜陋的。創建一個帶有錯誤枚舉的屬性,並創建一個DataTemplate或Style,將背景綁定到該屬性。

編輯:例...

在你的類:

public enum ParsingStatus { None, Completed, XmlError, HtmlError } 

private ParsingStatus _status = ParsingStatus.None; 
public ParsingStatus Status 
{ 
    get { return _status; } 
    set 
    { 
     if (_status != value) 
     { 
      _status = value; 
      NotifyPropertyChanged("Status"); 
     } 
    } 
} 

此後,您可以使用這樣的轉換器結合背景屬性:

public class ErrorToBrushConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     Employee.ParsingStatus input = (Employee.ParsingStatus)value; 
     switch (input) 
     { 
      case Employee.ParsingStatus.None: 
       return null; 
      case Employee.ParsingStatus.Completed: 
       return Brushes.LightGreen; 
      case Employee.ParsingStatus.XmlError: 
       return Brushes.Pink; 
      case Employee.ParsingStatus.HtmlError: 
       return Brushes.Yellow; 
      default: 
       return null; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 

而且各自的XAML:

<Window.Resources> 
    <local:ErrorToBrushConverter x:Key="ErrorToBrushConv"/> 
    ... 
</Window.Resources> 
    ... 
     <ListView ItemsSource="{Binding Data}"> 
      <ListView.ItemContainerStyle> 
       <Style TargetType="{x:Type ListViewItem}"> 
        <Setter Property="Background" 
          Value="{Binding Status, Converter={StaticResource ErrorToBrushConv}}"/> 
       </Style> 
      </ListView.ItemContainerStyle> 
      ... 
     </ListView> 

或者你只指定樣式和使用觸發器做狀態的切換:

<ListView.ItemContainerStyle> 
    <Style TargetType="{x:Type ListViewItem}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Status}" Value="XmlError"> 
       <Setter Property="Background" Value="Pink"/> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Status}" Value="HtmlError"> 
       <Setter Property="Background" Value="#FFFFFF66"/> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Status}" Value="Completed"> 
       <Setter Property="Background" Value="LightGreen"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</ListView.ItemContainerStyle> 

使用觸發器,由Robert Rossney建議,你可以看到它是很短,需要背後沒有代碼總之,我真的不能想到任何缺點,我不知道爲什麼我沒有這樣做這樣做在第一個地方...

這看起來像這樣的轉換器(黃色的觸發法更合適):
A colourful ListView

+0

@ H.B。謝謝,你能爲我提供一個例子嗎? – user683812 2011-03-30 14:30:46

+0

附加了一個廣泛的例子。編輯:哦woops,這是一個DataGrid,而不是一個GridView,我會嘗試移植它... – 2011-03-30 16:20:27

+0

已更改爲ListView等效。 – 2011-03-30 16:27:06