如何在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_
相关产品推荐
相关产品推荐

