【问题标题】:WPF C# - column content alignment and style depending on contentWPF C# - 列内容对齐和样式取决于内容
【发布时间】:2016-05-06 05:57:20
【问题描述】:

我有一个包含 3 列的数据网格。最后一列仅通过显示“✓”或“✗”来显示该行的数据集是启用还是禁用。 我想为最后一列设置样式,以便内容对齐居中,并且根据内容,“文本”应该是绿色(对于“✓”)或红色(对于“✗”)。那么我该如何实现呢?

<DataGrid x:Name="employeesDataGrid" Margin="5,55,5,0" VerticalAlignment="Top" Height="172" IsSynchronizedWithCurrentItem="False" MinRowHeight="10" HeadersVisibility="Column" AutoGenerateColumns="False" GridLinesVisibility="None" SelectionMode="Single" RowDetailsVisibilityMode="Collapsed" Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}">
    <DataGrid.Columns>
        <DataGridTextColumn x:Name="nameHeader" Header="{x:Static p:Resources.nameHeader}" Width="100"/>
        <DataGridTextColumn x:Name="surnameHeader" Header="{x:Static p:Resources.surnameHeader}" Width="200" />
        <DataGridTextColumn x:Name="isenabledHeader" Header="{x:Static p:Resources.isenabledHeader}" MinWidth="50">
            <DataGridTextColumn.HeaderStyle>
                <Style TargetType="{x:Type DataGridColumnHeader}">
                    <Setter Property="HorizontalAlignment" Value="Stretch" />
                    <Setter Property="HorizontalContentAlignment" Value="Center" />
                </Style>
            </DataGridTextColumn.HeaderStyle>
            <DataGridTextColumn.CellStyle>
                <Style TargetType="{x:Type DataGridCell}">
                    <Setter Property="HorizontalAlignment" Value="Center" />
                </Style>
            </DataGridTextColumn.CellStyle>
        </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

如何根据“✓”和“✗”设置不同的单元格样式? 这是我用 C# 填充数据网格的方法。

nameHeader.Binding = new Binding("Name");
surnameHeader.Binding = new Binding("Surname");
isenabledHeader.Binding = new Binding("IsEnabled");

employeesDataGrid.ItemsSource = null;
Employee employee = new Employee();
// returns a List<Employee>
employeesList = employee.GetAll();
employeesDataGrid.ItemsSource = employeesList;

编辑 我想出了如何自己对齐单元格的文本。代码已更新。所以现在我想把它涂成绿色或红色。有什么建议吗?

【问题讨论】:

  • 如何设置支票或X?它们是图像吗?我看到您的第三列绑定到 Employee.IsEnabled,但是“✓”和“✗”什么时候进来?

标签: c# wpf visual-studio datagrid styles


【解决方案1】:

如果“✓”和“✗”是字符串值,您可以像这样将DataTriggers 添加到您的DataGridTextColumnCellStyle 中。在我的测试示例中,我使用字符串值 first 表示绿色(您应该将其更改为“✓”)。

<Style.Triggers>
    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=Self}, 
                           Path=Content.Text}" Value="first">
        <Setter Property="Foreground" Value="Green" />
    </DataTrigger>
</Style.Triggers>

【讨论】:

  • 哈哈,你看前景,我看背景!我认为你可能是对的:)。有一个绿色检查,而不是绿色单元格看起来会更漂亮!
  • @bars222 完美运行。非常感谢你!为了解决一些问题,“✓”和“✗”是类提供的字符串,作为布尔值的替代方法。哦,是的,我想更改 Foreground 颜色:) 答案仍然适用于背景颜色。
【解决方案2】:

我想你如何引入“✓”和“✗”并不重要。如果我理解正确,您希望将单元格背景颜色设置为绿色或红色,这是一个 xaml 解决方案:

<DataGridTextColumn x:Name="isenabledHeader" Header="Is Enabled" MinWidth="50">
    <DataGridTextColumn.HeaderStyle>
        <Style TargetType="{x:Type DataGridColumnHeader}">
            <Setter Property="HorizontalAlignment" Value="Stretch" />
            <Setter Property="HorizontalContentAlignment" Value="Center" />
        </Style>
    </DataGridTextColumn.HeaderStyle>
    <DataGridTextColumn.CellStyle>
        <Style TargetType="{x:Type DataGridCell}">
            <Setter Property="HorizontalAlignment" Value="Stretch" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsEnabled}" Value="True">
                    <Setter Property="Background" Value="Green"></Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding IsEnabled}" Value="False">
                    <Setter Property="Background" Value="Red"></Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGridTextColumn.CellStyle>
    <DataGridTextColumn.ElementStyle>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="Margin" Value="2,0"/>
            <Setter Property="HorizontalAlignment" Value="Center"></Setter>
        </Style>
    </DataGridTextColumn.ElementStyle>
</DataGridTextColumn>

另一个(我希望是安全的)假设是 IsEnabled 是您的 Employee 类的一个属性。我们在这里所做的只是创建几个绑定到 IsEnabled 的 DataTrigger,并将单元格的背景设置为适当的颜色。请注意,我必须将 DataGridCell 的水平对齐更改为“Stretch”才能填充整个单元格。额外的 DataGridTextColumn.ElementStyle 应该考虑到您想要的居中。

注意:如果你愿意,你可以在后面的代码中添加 DataTriggers,但我个人永远记不住语法,所以我没有把它放在我的答案中:)。

【讨论】:

    猜你喜欢
    • 2014-08-02
    • 2013-07-10
    • 2010-11-09
    • 2019-12-16
    • 2015-06-21
    • 2012-12-07
    • 1970-01-01
    • 2011-08-09
    相关资源
    最近更新 更多