wpf 使用MVVM更改数据网格行的颜色

guz6ccqo  于 2023-06-24  发布在  其他
关注(0)|答案(2)|浏览(159)

我正在使用mvvm模式构建一个wpf应用程序。
我需要帮助,在改变颜色的特定行的数据网格。
DataGrid ItemsSource绑定到ViewModel中Datatable类型的属性。

<DataGrid ItemsSource="{Binding Data}"/>

另外,我有一个带有命令绑定的按钮

<Button Content="Run" Command="{Binding RunCommand}"/>

这是我的ViewModel中的RunCommand

RunCommand = new DelegateCommand(Run, CanRun);

Run方法处理执行。
在这个方法中,我迭代数据的DataRows,并根据我所做的一些计算,我想设置数据网格中每行的颜色。
绿色表示通过,红色表示失败。

foreach (DataRow row in Data.Rows){
      bool result=Calculate(row);
      if(result){
      SetTheRowColor(row,green);
      }
      else{
      SetTheRowColor(row,red);
      }
    }

所以我需要帮助来实现SetRowColor方法。
提前感谢任何帮助。

iqjalb3h

iqjalb3h1#

在代码中设置DataTable的特定列的值,并使用DataTrigger更改XAML标记中的行的颜色,例如:

<DataGrid ...>
    <DataGrid.CellStyle>
        <Style TargetType="DataGridCell">
            <Style.Triggers>
                <DataTrigger Binding="{Binding YourColumn}" Value="somevalue">
                    <Setter Property="Background" Value="Red" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.CellStyle>
</DataGrid>

代码:

foreach (DataRow row in Data.Rows) {
    if (row["name"]==Somthing){
        row["YourColumn"] = "somevalue";
    }
}
kse8i1jr

kse8i1jr2#

在ViewModel中添加
以下内容:

private Dictionary<DataRow, Brush>? _rowColors;
 public Dictionary<DataRow, Brush>? RowsColor
    {
        get { return _rowColors; }
        set
        {
            _rowColors = value;
            RaisePropertyChanged();
        }
    }

 private void SetRowColor(DataRow row, SolidColorBrush color)
    {
        RowsColor[row] = color;
        RaisePropertyChanged(nameof(RowsColor));

    }

添加这个新类:

public class RowColorConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values.Length == 2 && values[0] is Dictionary<DataRow, Brush> rowColors && values[1] is DataRowView rowView)
        {
            if (rowColors.Count != 0)
            {
                Brush value = rowColors.GetValueOrDefault(rowView.Row, Brushes.White);
                return value;
            }
        }

        return Brushes.White;
    }

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

最后,在视图中编辑数据网格为:

<DataGrid ItemsSource="{Binding  Data.DefaultView}"
                      CanUserAddRows="False" CanUserDeleteRows="False">
               
                <DataGrid.Resources>
                    <converter:RowColorConverter x:Key="RowColorConv"/>
                </DataGrid.Resources>

                <DataGrid.RowStyle>
                    <Style TargetType="DataGridRow">
                        <Setter Property="Background">
                            <Setter.Value>
                                <MultiBinding Converter="{StaticResource RowColorConv}">
                                    <Binding Path="DataContext.RowsColor" RelativeSource="{RelativeSource AncestorType=DataGrid}"/>
                                    <Binding/>
                                </MultiBinding>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </DataGrid.RowStyle>
            </DataGrid>

相关问题