C# 更改DataGrid的颜色

C# 更改DataGrid的颜色,c#,.net,wpf,datagrid,C#,.net,Wpf,Datagrid,我想更改整行的颜色,但当前代码的行为null数据网格。行不存在 例如,我想突出显示第三行 var row = datagrid.ItemContainerGenerator.ContainerFromItem(3) as Microsoft.Windows.Controls.DataGridRow; row.Background = Brushes.Blue; 试着这样做: <DataGrid.RowStyle> <Style TargetType="DataGri

我想更改整行的颜色,但当前代码的
行为null
<代码>数据网格。行不存在

例如,我想突出显示第三行

var row = datagrid.ItemContainerGenerator.ContainerFromItem(3) as Microsoft.Windows.Controls.DataGridRow;
row.Background = Brushes.Blue; 

试着这样做:

<DataGrid.RowStyle>
    <Style TargetType="DataGridRow">
          <Style.Triggers>
                <DataTrigger Binding="{Binding Executed}" Value="False">
                      <Setter Property="Background" Value="LightCoral" />
                </DataTrigger>
                <DataTrigger Binding="{Binding Executed}" Value="True">
                      <Setter Property="Background" Value="LightGreen" />
                </DataTrigger>
          </Style.Triggers>     
    </Style>
</DataGrid.RowStyle>


在这种情况下,我使用caliburn micro绑定背景颜色,这取决于我所在行中的bool(使用bool?保持白色,直到bool更改).

这并不是更改
DataGridRow
背景的最佳方法-您应该使用@David Danielewicz建议的
样式
-但对于当前的工作方法,您应该将从方法返回的对象强制转换为系统.Windows.Controls.DataGridRow

您还应该使用
ContainerFromIndex
方法获取对第四个元素的可视容器的引用。第三个元素的索引为2

试试这个:

var row = datagrid.ItemContainerGenerator.ContainerFromIndex(2) as System.Windows.Controls.DataGridRow;
row.Background = Brushes.Blue;
还要注意,要使其工作,您需要等待容器实际创建完成:

datagrid.Loaded += (ss, ee) => 
{
    var row = datagrid.ItemContainerGenerator.ContainerFromIndex(2) as System.Windows.Controls.DataGridRow;
    row.Background = Brushes.Blue;
};

从代码隐藏访问视图是一种糟糕的做法。更好地利用MVVM的强大功能:

<Window>
    <Window.Resources>
        <ResourceDictionary>
            <Style x:Key="DataGridRowStyle" TargetType="DataGridRow">
                <Setter Property="Background" Value="{Binding RowBackground}"/>
            </Style>
        </ResourceDictionary>
    </Window.Resources>
    <DataGrid ItemsSource="{Binding Records}" RowStyle="{StaticResource DataGridRowStyle}" AutoGenerateColumns="False" CanUserAddRows="False">        
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Value}" Width="*"/>
        </DataGrid.Columns>
    </DataGrid>    
</Window>

public MainWindow()
{
    InitializeComponent();
    DataContext = new MainWindowViewModel(); 
}

public class MainWindowViewModel
{
    public MainWindowViewModel()
    {
        Records.Add(new RecordViewModel()
        {
            Value = "Red",
            RowBackground = new SolidColorBrush(Colors.LightCoral)
        });

        Records.Add(new RecordViewModel()
        {
            Value = "Green",
            RowBackground = new SolidColorBrush(Colors.LightGreen)
        });

        Records.Add(new RecordViewModel()
        {
            Value = "Blue",
            RowBackground = new SolidColorBrush(Colors.LightBlue)
        });

        Records[2].Value = "Not blue anymore";
        Records[2].RowBackground = new SolidColorBrush(Colors.LightPink);
    }

    public ObservableCollection<RecordViewModel> Records { get; } = new ObservableCollection<RecordViewModel>();
}

public class RecordViewModel : INotifyPropertyChanged
{
    private string _value;
    private Brush _rowBG;
    public event PropertyChangedEventHandler PropertyChanged;

    public string Value
    {
        get
        {
            return _value;
        }
        set
        {
            _value = value;
            OnPropertyChanged(nameof(Value));
        }
    }

    public Brush RowBackground
    {
        get
        {
            return _rowBG;
        }
        set
        {
            _rowBG = value;
            OnPropertyChanged(nameof(RowBackground));
        }
    }

    private void OnPropertyChanged(string name)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }
}

公共主窗口()
{
初始化组件();
DataContext=新的MainWindowViewModel();
}
公共类MainWindowViewModel
{
公共主窗口视图模型()
{
添加(新的RecordViewModel()
{
Value=“Red”,
RowBackground=新的SolidColorBrush(Colors.LightCoral)
});
添加(新的RecordViewModel()
{
Value=“绿色”,
RowBackground=新的SolidColorBrush(颜色.浅绿色)
});
添加(新的RecordViewModel()
{
Value=“蓝色”,
RowBackground=新的SolidColorBrush(Colors.LightBlue)
});
记录[2]。Value=“不再是蓝色”;
记录[2]。RowBackground=新的SolidColorBrush(Colors.LightPink);
}
公共ObservableCollection记录{get;}=new ObservableCollection();
}
公共类RecordViewModel:INotifyPropertyChanged
{
私有字符串_值;
私人灌木丛_rowBG;
公共事件属性更改事件处理程序属性更改;
公共字符串值
{
得到
{
返回_值;
}
设置
{
_价值=价值;
OnPropertyChanged(名称(值));
}
}
公共画笔背景
{
得到
{
返回_rowBG;
}
设置
{
_rowBG=值;
OnPropertyChanged(nameof(RowBackground));
}
}
私有void OnPropertyChanged(字符串名称)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(名称));
}
}

这是WPF,不是吗?是的,它是……。背景颜色是否取决于属性或其他因素?您可以尝试使用样式。它是Microsoft.Windows.Controls.DataGridYes,视情况而定。它不是3,而是一个函数,根据时间改变这个值,我如何触发颜色变化?在代码中。通过将bool设置为false或true<代码>已执行的私有布尔;public bool Executed{get=>\u Executed;set{\u Executed=value;NotifyOfPropertyChange();}这是使用caliburn micro从viewmodel执行的方式。设置executed将更新viewsame。row=null您实际在哪里执行此代码?您必须等待容器实际创建完成。它表示为null,但代码不会崩溃。如果我选中steps.ItemContainerGeneratorI c可以查看所有项目。因此我非常确定它正在从表中获取数据。请尝试根据我的编辑在加载的事件处理程序中调用ContainerFromIndex,如果仍然无法使其正常工作,请提供问题的完整示例: