如何动态更改WPF listview行背景颜色?

时间:2017-02-16 16:57:20

标签: wpf

我是WPF新手,我有以下用于列表视图的xaml代码:

<ListView x:Name="listView1" ItemsSource="{Binding Processes1}"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="470" Margin="10,95,150,6" Width="565" SelectionChanged="NetscalerCfgView_listView1_SelectionChanged">
   <ListView.View>
       <GridView>
           <GridViewColumn Header="Line"  DisplayMemberBinding="{Binding srcCfgLineNum}"/>
           <GridViewColumn Header="Source Config" DisplayMemberBinding="{Binding srcConfigText}"/>
       </GridView>
   </ListView.View>
</ListView>

我有我在listview中显示的类SrcListViewInfo:

public class SrcListViewInfo
{
    public int srcCfgLineNum { get; set; }
    public string srcConfigText { get; set; }
}

我在windows load事件中声明了它:

public ObservableCollection<SrcListViewInfo> processes1 = null;
processes1 = new ObservableCollection<SrcListViewInfo>();

我想动态地在不同情况下动态地在不同函数中为行背景着色,例如:

case DiffResultSpanStatus.DeleteSource:
    for (i = 0; i < drs.Length; i++)
    {
        SrcListViewInfo newInfo = new SrcListViewInfo();
        newInfo.BackgroundColor = new SolidColorBrush(Colors.Red);
        // newInfo.BackgroundColor = Brushes.Red;
        newInfo.srcCfgLineNum = cnt;
        newInfo.srcConfigText = ((TextLine)source.GetByIndex(drs.SourceIndex + i)).Line;
        // newInfo.BackgroundColor = Brushes.Red; << want to set the color like this.

我尝试过实心刷,但它似乎没有正常工作。

3 个答案:

答案 0 :(得分:6)

您可以直接在xaml中设置ListViewItem的样式,

示例:

假设你的名字&#34;变量是一个字符串,你可以尝试

<ListView Name="whatever">
  <ListView.Resources>
    <Style TargetType="{x:Type ListViewItem}">
      <Style.Triggers>
        <DataTrigger Binding="{Binding Name}"
                      Value="John">
          <Setter Property="Background"
                  Value="Red" />
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </ListView.Resources>
....

现在任何带有&#34;名称&#34;的ListView行&#34; John&#34;的价值会有一个&#34; Red&#34;背景

答案 1 :(得分:2)

选项

是在IMultiValueConverter

中使用ListView.ItemTemplate
<ListView DataContext="{Binding}" ItemsSource="{Binding Models}" AlternationCount="3" >
        <ListView.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Name  }"/>
                    <TextBlock Text="{Binding Desc }"/>
                    <StackPanel.Background> 
                            <MultiBinding Converter="{StaticResource BackConverter}">
                                <Binding />
                                <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=ItemsControl}"/>
                            </MultiBinding> 
                    </StackPanel.Background>
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>


public class BackConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        // write your logic (You have the model and the view model)

        var index = ((ItemsControl)values[1]).Items.IndexOf(values[0]);
        if (index % 2 == 0)
            return Brushes.Gray;
        return Brushes.White;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

另一个选项

是在ItemsControl.AlternationIndex

中使用ListView.ItemContainerStyle
<ListView DataContext="{Binding}" ItemsSource="{Binding Models}" AlternationCount="3" >
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Style.Triggers>
                    <Trigger Property="ItemsControl.AlternationIndex"  Value="0">
                        <Setter Property="Background" Value="Red" />
                    </Trigger>
                    <Trigger Property="ItemsControl.AlternationIndex"  Value="1">
                        <Setter Property="Background" Value="Green" />
                    </Trigger>
                    <Trigger Property="ItemsControl.AlternationIndex"  Value="2">
                        <Setter Property="Background" Value="Blue" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </ListView.ItemContainerStyle>
    </ListView>

修改

public MainWindow()
{
     InitializeComponent();
     lv.ItemsSource = new List<string> { "a", "b", "c", "d", "e" };
}

答案 2 :(得分:0)

经过一些谷歌搜索后,我发现了自己的解决方案,我使用Listview.ItemsSource,作为源码,我使用List和ListViewItems然后我可以在List中设置指定ListViewItem的背景,只刷新listview。

XAML:

 <ListView x:Name="listView" ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto" Grid.Row="1">
                <ListView.View>
                    <GridView>
                        <GridViewColumn Header="IP"  DisplayMemberBinding="{Binding IP}" Width="Auto"/>
                        <GridViewColumn Header="PING" DisplayMemberBinding="{Binding Ping}" Width="Auto"/>
                        <GridViewColumn Header="Host Name" DisplayMemberBinding="{Binding DNS}" Width="Auto"/>
                        <GridViewColumn Header="Mac" DisplayMemberBinding="{Binding MAC}" Width="Auto"/>
                        <GridViewColumn Header="Výrobce" DisplayMemberBinding="{Binding Manufacturer}" Width="Auto"/>
                    </GridView>
                </ListView.View>
            </ListView>

使用带灰色背景的项目填充ListView:

List<ListViewItem> ITEMS = new List<ListViewItem>();
private void button_Click(object sender, RoutedEventArgs e)
{
    for (int i = 1; i < 20; i++)
    {
        ListViewItem OneItem = new ListViewItem();
        OneItem.Background = Brushes.LightGray;
        OneItem.Content = new Device() { IP = "1.1.1.1", Ping = "30ms", DNS = "XYZ", MAC = "2F:3C:5F:41:F9", Manufacturer = "Intel" };
        ITEMS.Add(OneItem);
        listView.ItemsSource = ITEMS;
    }
    listView.Items.Refresh();
}
public class Device
{
    public string IP { get; set; }
    public string Ping { get; set; }
    public string DNS { get; set; }
    public string MAC { get; set; }
    public string Manufacturer { get; set; }
}

为行更改颜色创建方法:

private void ChangeRowColor(int RowIndex,SolidColorBrush NewBackground)
{
    ITEMS[RowIndex].Background = NewBackground;
    listView.Items.Refresh();
}

并使用它:

private void button1_Click(object sender, RoutedEventArgs e)
{
    ChangeRowColor(4, Brushes.Green);
}