【问题标题】:Change row color based on collection根据集合更改行颜色
【发布时间】:2014-01-17 02:37:18
【问题描述】:

在我的订单DataGrid 中,我需要更改其中客户在集合中多次存在的行的背景颜色。

在上面的DataGrid 中,我希望 Jimmy 的订单以黄色显示,因为 Jimmy 有多个订单。
这就是我填充DataGrid的方式:

 var people = new List<Person>()
        {
            new Person{CustName = "Jimmy", CustNum = 1, OrderNumber = "1111", OrederDate = DateTime.Now.AddDays(Helpers.GetRandom(1,10))},
            new Person{CustName = "Alex", CustNum = 5, OrderNumber = "2222", OrederDate = DateTime.Now.AddDays(Helpers.GetRandom(1,10))},
            new Person{CustName = "Jimmy", CustNum = 1, OrderNumber = "3333", OrederDate = DateTime.Now.AddDays(Helpers.GetRandom(1,10))},
            new Person{CustName = "Robert", CustNum = 7, OrderNumber = "4444", OrederDate = DateTime.Now.AddDays(Helpers.GetRandom(1,10))}
        };

        dgOrders.ItemsSource = people;

还有XAML

<DataGrid x:Name="dgOrders" CanUserAddRows="False" CanUserDeleteRows="False" 
                      CanUserReorderColumns="True" AutoGenerateColumns="False"
                      VerticalScrollBarVisibility="Visible" Height="250">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Customer Number" Binding="{Binding CustNum}" Width="Auto"/>
            <DataGridTextColumn Header="Customer Name" Binding="{Binding CustName}" Width="*"/>
            <DataGridTextColumn Header="Order Number" Binding="{Binding OrderNumber}" Width="Auto"/>
            <DataGridTextColumn Header="Date" Binding="{Binding OrederDate, StringFormat=\{0:dd/MM/yyyy\}}" Width="Auto"/>
        </DataGrid.Columns>
    </DataGrid>

【问题讨论】:

    标签: c# wpf datagrid


    【解决方案1】:

    您可以将IMultiValueConverterDataGridRowStyle 结合使用。在转换器中传递 DataGrid 的 ItemsSource 和当前行的 CustName 属性。

    转换器将检查 ItemSource 中是否存在超过 1 个具有相同 CustName 的项目,返回你要说的画笔 Brushes.Green 否则它将返回 Brushes.Transparent

    <DataGrid>
       <DataGrid.Resources>
           <local:ItemCountToBrushConverter x:Key="ItemCountToBrushConverter"/>
       </DataGrid.Resources>
        <DataGrid.RowStyle>
           <Style TargetType="DataGridRow">
              <Setter Property="Background">
                 <Setter.Value>
                    <MultiBinding Converter="{StaticResource ItemCountToBrushConverter}">
                        <Binding Path="ItemsSource"
                                 RelativeSource="{RelativeSource Mode=FindAncestor,
                                                           AncestorType=DataGrid}"/>
                         <Binding Path="CustName"/>
                    </MultiBinding>
                 </Setter.Value>
              </Setter>
           </Style>
        </DataGrid.RowStyle>
        ....
    </DataGrid>
    

    转换器代码:

    public class ItemCountToBrushConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType,
                              object parameter, CultureInfo culture)
        {
            if (values.Length == 2)
            {
                IEnumerable<Person> collection = (IEnumerable<Person>)values[0];
                int count = collection.Count(item => item.CustName ==
                                                      values[1].ToString());
                return (count > 1) ? Brushes.Green : Brushes.Transparent;
            }
            return Brushes.Transparent;
        }
    
        public object[] ConvertBack(object value, Type[] targetTypes,
                                    object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    

    【讨论】:

      【解决方案2】:

      或者向您的 Person 类添加另一个属性(此处名为 Mark)。当您希望视图突出显示该人时,在您的视图模型中将 Mark 设置为 true。 XAML 看起来像这样:

              <DataGrid x:Name="dgOrders" CanUserAddRows="False" CanUserDeleteRows="False" 
                        CanUserReorderColumns="True" AutoGenerateColumns="False"
                        VerticalScrollBarVisibility="Visible" Height="250">
              <DataGrid.Columns>
                  <DataGridTextColumn Header="Customer Number" Binding="{Binding CustNum}" Width="Auto"/>
                  <DataGridTextColumn Header="Customer Name" Binding="{Binding CustName}" Width="*"/>
                  <DataGridTextColumn Header="Order Number" Binding="{Binding OrderNumber}" Width="Auto"/>
                  <DataGridTextColumn Header="Date" Binding="{Binding OrederDate, StringFormat=\{0:dd/MM/yyyy\}}" Width="Auto"/>
              </DataGrid.Columns>
              <DataGrid.RowStyle>
                  <Style TargetType="DataGridRow">
                      <Style.Triggers>
                      <DataTrigger Binding="{Binding Path=Mark}" Value="True">
                          <Setter Property="Background" Value="Red" />
                      </DataTrigger>
                      </Style.Triggers>
                  </Style>
              </DataGrid.RowStyle>
          </DataGrid>        
      

      【讨论】:

        猜你喜欢
        • 2015-01-04
        • 2013-08-28
        • 1970-01-01
        • 1970-01-01
        • 2017-07-10
        • 2015-09-02
        • 2019-07-26
        相关资源
        最近更新 更多