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

如何在DevExpress DxGrid的Columns节点内获取Context上下文

如何在DevExpress DxGrid的Columns节点内获取Context上下文

嗨,我来帮你捋清楚这个问题~

首先得明确一点:你没法直接在<Columns>节点里拿到行级的context对象。因为<Columns>是用来定义Grid的列结构的,属于Grid初始化阶段的元数据声明,这时候还没有具体的行数据被渲染,自然就不存在对应每一行的context。只有当Grid开始渲染每一行的单元格时,CellDisplayTemplate这类行级模板才会获得当前行的context实例。

那要实现“多个列共享@t的值”这个需求,有两个比较靠谱的方案:

方案一:封装可复用的方法,在每个模板里调用

把获取t的逻辑抽成一个单独的方法,这样每个需要用到t的CellDisplayTemplate里都能直接调用,避免重复写代码:

@* 先在页面里定义可复用的方法 *@
@functions {
    private YourTType GetRowTValue(MyType dataItem) {
        return GetData(dataItem); // 这里就是你原来的逻辑
    }
}

<DxGrid ...>
    <Columns>
        <DxGridDataColumn Caption="Allocated Crew Member" MinWidth="80">
            <CellDisplayTemplate>
                @{
                    var t = GetRowTValue((MyType)context.DataItem);
                }
                <DxComboBox ...
                            Value="@t"
                            NullText="Select Member" />
             </CellDisplayTemplate>
        </DxGridDataColumn>
        @* 另一个需要用到t的列 *@
        <DxGridDataColumn Caption="Other Column">
            <CellDisplayTemplate>
                @{
                    var t = GetRowTValue((MyType)context.DataItem);
                }
                <!-- 这里可以直接使用t做其他操作 -->
            </CellDisplayTemplate>
        </DxGridDataColumn>
    </Columns>
</DxGrid>

这个方案简单直接,适合逻辑不复杂的场景,而且不需要改动数据源结构。

方案二:用ViewModel包装数据,预计算t的值

如果你的数据源是可修改的,更优雅的方式是把每个数据项包装成一个ViewModel,提前计算好t的值,这样所有列的模板都能直接取用:

// 先定义一个ViewModel类,包装你的原始数据
public class MyRowViewModel {
    public MyType OriginalItem { get; set; }
    public YourTType T { get; set; }

    public MyRowViewModel(MyType item) {
        OriginalItem = item;
        T = GetData(item); // 在构造时就计算好t的值
    }
}

然后在页面里把原始数据源转换成ViewModel集合:

@code {
    private IEnumerable<MyRowViewModel> GridData { get; set; }

    protected override void OnInitialized() {
        // 假设OriginalData是你的原始数据源
        GridData = OriginalData.Select(item => new MyRowViewModel(item));
    }
}

<DxGrid Data="@GridData" ...>
    <Columns>
        <DxGridDataColumn Caption="Allocated Crew Member" MinWidth="80">
            <CellDisplayTemplate>
                var rowVm = (MyRowViewModel)context.DataItem;
                <DxComboBox ...
                            Value="@rowVm.T"
                            NullText="Select Member" />
             </CellDisplayTemplate>
        </DxGridDataColumn>
        <DxGridDataColumn Caption="Other Column">
            <CellDisplayTemplate>
                var rowVm = (MyRowViewModel)context.DataItem;
                <!-- 直接用rowVm.T即可,不需要重复计算 -->
            </CellDisplayTemplate>
        </DxGridDataColumn>
    </Columns>
</DxGrid>

这个方案把数据处理逻辑从视图层移到了ViewModel里,让视图更简洁,也方便后续维护和扩展。

总结一下:不要试图在<Columns>节点里拿行级context,因为那里根本没有这个上下文。选择上面两种方案中的一种,就能实现多列共享t值的需求啦~

备注:内容来源于stack exchange,提问作者meeth_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 12:12:58