以编程方式更改单个ListViewItem布局

时间:2009-05-19 22:09:18

标签: c# wpf layout listviewitem

我有一个ListView,其中包含GridView

<ListView x:Name="listViewPersons" ItemsSource="{Binding Path=Persons, Mode=OneWay}" IsSynchronizedWithCurrentItem="True" 
                  Height="Auto" HorizontalAlignment="Stretch" Margin="4,4,4,4" Grid.Row="4" VerticalAlignment="Stretch" Width="Auto">
            <ListView.View>
                <GridView x:Name="gridViewPersons">
                    <GridViewColumn Header="Enabled">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel>
                                    <CheckBox HorizontalAlignment="Center" IsChecked="true" />
                                </StackPanel>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="Name"  DisplayMemberBinding="{Binding Path=Name}" Width="142" />
                    <GridViewColumn Header="Age"  DisplayMemberBinding="{Binding Path=Age}" Width="142" />
                    <GridViewColumn Header="Gender"  DisplayMemberBinding="{Binding Path=Gender}" Width="142" />
                </GridView>
            </ListView.View>
        </ListView>

我希望能够以编程方式将每个ListViewItem s(或网格中的行)背景或前景更改为我想要的任何颜色,例如

listViewPersons.Items[0].Background = Brush.Red;
listViewPersons.Items[1].Background = Brush.Blue;
listViewPersons.Items[2].Background = Brush.Green

我知道前面的代码行不起作用,但它几乎解释了我想要实现的目标。有什么帮助吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

这种方法怎么样:

  1. 将ForegroundColor和Background颜色绑定到Persons中的属性。我们将此属性称为PersonStatus,并将其类型设置为状态枚举,仅用于此示例。
  2. 确保此人员实施INotifyPropertyChanged,此属性的setter会引发ProperyChanged事件。该物业将如下所示:

    public Status PersonStatus
    {
        get
        {
            return status;
        }
        set
        {
            if (value != status)
            {
                status= value;
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs("PersonStatus"));
            }
        }
    }
    
  3. 创建一个IValueConverter,它采用Status类型并返回Brushes.Black,Brushes.Red等。这样的事情:

    public class StatusToColorConverter : IValueConverter 
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (targetType != typeof(Status))
                throw new InvalidOperationException("targetType must be Status");
    
            Status status = (Status)value;
    
            switch (status)
            {
                case Status.New:
                    return Brushes.Black;
                case Status.Professional:
                    return Brushes.Blue;
                case Status.Delete:
                    return Brushes.Red;
                default:
                    return Brushes.Black;
            }
        }
    
        public object ConvertBack(object value, Type targetType, object parameter,  System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        } 
    }