You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF中DevExpress的dxg:GridColumn基于布尔值自定义显示文本咨询

WPF DevExpress GridControl 布尔列动态显示文本解决方案

问题根因

你当前的实现不生效的核心原因有两点:

  1. dxe:TextEditSettings 是编辑器的配置类,不属于界面渲染的视觉树元素,直接为其设置TextBlock.Text依赖属性不会传递到最终渲染的单元格控件上。
  2. 触发器的绑定路径错误,没有指向行数据的IsLocked字段,绑定Text/Content属性无法取到对应数据源的值。

方案1:使用值转换器(最推荐,无后台代码耦合)

第一步:实现值转换器

using System;
using System.Globalization;
using System.Windows.Data;

public class BoolToLockStatusConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is bool isLocked)
        {
            return isLocked ? "Locked" : "UnLocked";
        }
        return "UnLocked";
    }

    // 只读列不需要实现回转逻辑
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

第二步:注册转换器到页面资源

<Window.Resources>
    <!-- 替换local为你自己的转换器命名空间 -->
    <local:BoolToLockStatusConverter x:Key="BoolToLockStatusConverter" />
</Window.Resources>

第三步:修改GridColumn配置

<dxg:GridColumn IsSmart="True" 
                FieldName="IsLocked" 
                Header="{x:Static localization:Resources.Property_IsLocked}">
    <dxg:GridColumn.Binding>
        <Binding Path="IsLocked" Converter="{StaticResource BoolToLockStatusConverter}" />
    </dxg:GridColumn.Binding>
    <dxg:GridColumn.EditSettings>
        <dxe:TextEditSettings HorizontalContentAlignment="Center" />
    </dxg:GridColumn.EditSettings>
</dxg:GridColumn>

方案2:使用CustomColumnDisplayText事件(快速实现)

如果你不想新增转换器类,可以直接给GridControl的TableView绑定显示文本自定义事件:

第一步:XAML中添加事件绑定

<dxg:GridControl.View>
    <dxg:TableView CustomColumnDisplayText="TableView_OnCustomColumnDisplayText" />
</dxg:GridControl.View>

第二步:后台实现事件逻辑

private void TableView_OnCustomColumnDisplayText(object sender, DevExpress.Xpf.Grid.CustomColumnDisplayTextEventArgs e)
{
    // 替换YourModel为你绑定的数据源实体类名
    if (e.Column.FieldName == nameof(YourModel.IsLocked) && e.Value is bool isLocked)
    {
        e.DisplayText = isLocked ? "Locked" : "UnLocked";
    }
}

方案3:使用DisplayTemplate自定义渲染模板

如果你需要对单元格样式做更多自定义,可以直接重写列的显示模板:

<dxg:GridColumn IsSmart="True" 
                FieldName="IsLocked" 
                Header="{x:Static localization:Resources.Property_IsLocked}">
    <dxg:GridColumn.DisplayTemplate>
        <ControlTemplate>
            <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center">
                <TextBlock.Style>
                    <Style TargetType="TextBlock">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding RowData.Row.IsLocked}" Value="True">
                                <Setter Property="Text" Value="Locked" />
                            </DataTrigger>
                            <DataTrigger Binding="{Binding RowData.Row.IsLocked}" Value="False">
                                <Setter Property="Text" Value="UnLocked" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </TextBlock.Style>
            </TextBlock>
        </ControlTemplate>
    </dxg:GridColumn.DisplayTemplate>
</dxg:GridColumn>

内容的提问来源于stack exchange,提问作者makri aymen abderraouf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 20:36:01