gpt4 book ai didi

c# - 设置 DataGrid 列的样式

转载 作者:太空宇宙 更新时间:2023-11-03 10:44:25 27 4
gpt4 key购买 nike

我有一个 DataGrid,我试图根据该网格单元格中显示的文本设置每个元素的背景。网格单元格定义如下并且可以正常访问它们:

<Window.Resources>
<Style TargetType="{x:Type DataGridCell}">
<EventSetter Event="MouseDown" Handler="Clicked" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="BorderThickness" Value="1"/>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>

不起作用的部分是我无法为 DataGridTextColumn 设置样式,我下面的 setter 都没有做任何事情。 DataGrid 本身显示正确。

        <DataGrid Name="dataGrid1" AutoGenerateColumns="False" IsReadOnly="true">
<DataGridTextColumn>
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="Background" Value="Black"/>
<Style.Triggers>
<Trigger Property="Text" Value="None">
<Setter Property="Background" Value="Aquamarine"/>
</Trigger>
<Trigger Property="Text" Value="First">
<Setter Property="Background" Value="Blue"/>
</Trigger>
</Style.Triggers>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
</DataGrid>

在此先感谢您的帮助。

编辑 1更新了对 NETscape 问题的回答。1) 我的 DataGrid 显示正确,我什至点击了网格中的项目并修改了它后面的数据。但是,我的 XAML 中没有设置 DataSource,我的 View 中只有一个指向 DataGrid 的简单 DataContext。

2) 我不认为问题出在我的变量名上,因为下面没有触发器的 setter 属性也没有显示:

 <Setter Property="HorizontalAlignment" Value="Center" />

编辑 2再次回应 NETscape 的问题/评论。我最初没有发布我的代码隐藏是因为,因为我所有的对象都正确显示,所以我没有在那里寻找问题。但我想我错了。我的网格和网格中列的数据绑定(bind)不同。我的网格的 DataContext 是一个 RowObjects 数组。每个 DataGridTextColumn 的数据上下文是我的 RowObject 中的一个条目,与一周中的特定一天相关联。

    DataGridTextColumn cSunday = new DataGridTextColumn();
DataGridTextColumn cMonday = new DataGridTextColumn();
public TimeSlice[] TimeArray = new TimeSlice[48];

MyWnd.dataGrid1.DataContext = TimeArray; //sets DataContext for the DataGrid
CultureInfo cu = new CultureInfo(App.CultureID);


//creates one column
cSunday.Header = cu.DateTimeFormat.GetDayName(DayOfWeek.Sunday);
cSunday.Binding = new Binding("StatusSunday");
Wnd.dataGrid1.Columns.Add(cSunday);

cMonday.Header = cu.DateTimeFormat.GetDayName(DayOfWeek.Monday);
cMonday.Binding = new Binding("StatusMonday");
Wnd.dataGrid1.Columns.Add(cMonday);

编辑 3为了完整起见,添加从 NETscape 的答案派生的工作解决方案。 XAML:

<Window
<Window.Resources>
<Style TargetType="{x:Type DataGridCell}">
<EventSetter Event="MouseDown" Handler="Clicked" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="BorderThickness" Value="1"/>
</Trigger>
</Style.Triggers>
</Style>
<Style x:Key="MyDataGridTextColumnElementStyle"
TargetType="{x:Type TextBlock}">
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="Background" Value="Black"/>
<Style.Triggers>
<Trigger Property="Text" Value="None">
<Setter Property="Background" Value="Aquamarine"/>
</Trigger>
<Trigger Property="Text" Value="First">
<Setter Property="Background" Value="Blue"/>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid Name="MainView" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Border Grid.Row ="0">
</Border>
<Border Grid.Row="1">
<DataGrid Name="dataGrid1" AutoGenerateColumns="False" IsReadOnly="true"/>
</Border>
</Grid>
</Window>

我的 View 模型中用于设置前 2 天/列的代码:

public TimeSlice[] TimeArray = new TimeSlice[48];
public ViewModelr(WndCalendar Wnd)
{


MyWnd = Wnd;
MyWnd.DataContext = this;
MyWnd.dataGrid1.DataContext = TimeArray;

cTime.Header = "";
cTime.Binding = new Binding("TimeofDay");
Wnd.dataGrid1.Columns.Add(cTime);

CultureInfo cu = new CultureInfo(App.CultureID);

cSunday.Header = cu.DateTimeFormat.GetDayName(DayOfWeek.Sunday);
cSunday.Binding = new Binding("StatusSunday");
Wnd.dataGrid1.Columns.Add(cSunday);
cSunday.ElementStyle = MyWnd.FindResource("MyDataGridTextColumnElementStyle") as Style;

cMonday.Header = cu.DateTimeFormat.GetDayName(DayOfWeek.Monday);
cMonday.Binding = new Binding("StatusMonday");
Wnd.dataGrid1.Columns.Add(cMonday);
cMonday.ElementStyle = MyWnd.FindResource("MyDataGridTextColumnElementStyle") as Style;

最佳答案

Frank E,您的 Edit 2 可能泄露了您的问题;了解何时以编程方式执行操作总是有帮助的!

Windows.Resources 中设置 Style 就是说,“嘿,对于此控件中的任何 DataGridCell,将此样式应用于它”这就是它正常工作的原因,因为在添加所有信息之后,样式仍然得到应用;这就是它似乎有效的原因。

现在请注意,您正在定义一个 DataGridTextColumn,它是 ElementStyle。这并没有应用于所有 DataGridTextColumn,这可能正是您所想的。相反,它被应用于单个 DataGridTextColumn!因为您没有为 DataGridTextColumn 定义任何内容,所以它实际上是在 DataGrid 中绘制的,但是由于该列没有内容,所以它是 Width = 0

由于您是以编程方式创建其他列,因此您需要以编程方式应用样式。所以你应该有这样的东西:

<Window.Resources>
<Style TargetType="{x:Type DataGridCell}">
<EventSetter Event="MouseDown" Handler="Clicked" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="BorderThickness" Value="1"/>
</Trigger>
</Style.Triggers>
</Style>
<Style x:Key="MyDataGridTextColumnElementStyle"
TargetType="{x:Type TextBlock}">
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="Background" Value="Black"/>
<Style.Triggers>
<Trigger Property="Text" Value="None">
<Setter Property="Background" Value="Aquamarine"/>
</Trigger>
<Trigger Property="Text" Value="First">
<Setter Property="Background" Value="Blue"/>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>

然后当您在后台代码中创建列时,执行如下操作:

cSunday.ElementStyle = MyWnd.FindResource("MyDataGridTextColumnElementStyle") as Style;

对于您正在创建的每一列。

据我了解,不分配 x:Key 会将样式应用于类型为 TargetType 的所有元素,因此由于我们分配了 x :Key 到第二个样式,不是所有的 TextBlock 都会被分配那个样式,只有我们指定的那些。

如果这有帮助,请告诉我。

关于c# - 设置 DataGrid 列的样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23998136/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com