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,如果仍然无法使其正常工作,请提供问题的完整示例: