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

如何在SFDataGrid中实现列间绑定,根据同行布尔值设置小数位数

解决SFDataGrid中根据同行布尔值设置GridNumericColumn小数位数的问题

问题核心在于GridNumericColumn的Decimals属性是列级属性,它的绑定上下文是DataGrid的ViewModel,而非当前行的数据模型,所以直接绑定行模型的OnlyIntegerQuantities属性会失效。要实现每行动态控制小数位数,需要在单元格级别进行绑定,具体方案如下:

方案1:使用CellTemplate自定义数值单元格

通过自定义CellTemplate,在模板内的数值控件上绑定行模型的布尔属性,结合转换器动态设置小数位数:

<syncf:GridCheckBoxColumn HeaderText="Headeer1"
                          MappingName="OnlyIntegerQuantities"
                          Width="120"
                          AllowEditing="True"/>

<syncf:GridNumericColumn HeaderText="Header2"
                         MappingName="Quantity"
                         Width="120"
                         AllowEditing="True"
                         ValidationMode="Decimal">
    <syncf:GridNumericColumn.CellTemplate>
        <DataTemplate>
            <syncf:SfNumericTextBox Value="{Binding Quantity}"
                                    Decimals="{Binding OnlyIntegerQuantities, Converter={StaticResource BooleanToDecimalConverter}}"
                                    HorizontalAlignment="Stretch"
                                    VerticalAlignment="Center"/>
        </DataTemplate>
    </syncf:GridNumericColumn.CellTemplate>
    <!-- 编辑模式同步模板,保持行为一致 -->
    <syncf:GridNumericColumn.EditTemplate>
        <DataTemplate>
            <syncf:SfNumericTextBox Value="{Binding Quantity, Mode=TwoWay}"
                                    Decimals="{Binding OnlyIntegerQuantities, Converter={StaticResource BooleanToDecimalConverter}}"
                                    HorizontalAlignment="Stretch"
                                    VerticalAlignment="Center"/>
        </DataTemplate>
    </syncf:GridNumericColumn.EditTemplate>
</syncf:GridNumericColumn>

方案2:通过CellStyle设置单元格的Decimals属性

如果不想自定义完整模板,可以通过CellStyle直接绑定单元格的Decimals属性(需确认SFDataGrid的单元格控件支持该属性绑定):

<syncf:GridCheckBoxColumn HeaderText="Headeer1"
                          MappingName="OnlyIntegerQuantities"
                          Width="120"
                          AllowEditing="True"/>

<syncf:GridNumericColumn HeaderText="Header2"
                         MappingName="Quantity"
                         Width="120"
                         AllowEditing="True"
                         ValidationMode="Decimal">
    <syncf:GridNumericColumn.CellStyle>
        <Style TargetType="syncf:GridNumericCell">
            <Setter Property="Decimals"
                    Value="{Binding OnlyIntegerQuantities, Converter={StaticResource BooleanToDecimalConverter}}"/>
        </Style>
    </syncf:GridNumericColumn.CellStyle>
</syncf:GridNumericColumn>

补充:布尔转小数位数的转换器示例

确保你的BooleanToDecimalConverter逻辑符合需求,比如布尔值为True时设为0位小数(整数),False时设为指定位数:

public class BooleanToDecimalConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is bool isInteger)
        {
            return isInteger ? 0 : 2; // 可根据业务调整默认小数位数
        }
        return 2; // 非布尔值时的默认值
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

关键说明

  • 列级的Decimals属性绑定的是DataGrid的全局上下文(ViewModel),无法直接访问每行的模型数据;
  • 单元格的DataContext是当前行的数据模型,因此在CellTemplate或CellStyle中绑定OnlyIntegerQuantities可以正确获取同行的布尔值;
  • 若使用编辑模板,需同步绑定Decimals属性,确保编辑状态下的行为与显示状态一致。

内容的提问来源于stack exchange,提问作者Jorge Valderrama

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 21:12:51