WPF中DevExpress的dxg:GridColumn基于布尔值自定义显示文本咨询
WPF DevExpress GridControl 布尔列动态显示文本解决方案
问题根因
你当前的实现不生效的核心原因有两点:
dxe:TextEditSettings是编辑器的配置类,不属于界面渲染的视觉树元素,直接为其设置TextBlock.Text依赖属性不会传递到最终渲染的单元格控件上。- 触发器的绑定路径错误,没有指向行数据的
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
相关产品推荐
相关产品推荐

