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

DevExpress DataGrid:如何设置DetailDescriptor中GridControl的ItemSource

解决方案:让DetailDescriptor里的GridControl绑定主Grid的同一个数据源

这里的核心问题是DataContext的层级差异:主GridControl的DataContext是你的父ViewModel(包含SearchResultViewModel属性的那个),但DetailDescriptor里的ContentTemplate默认会把DataContext切换为主Grid当前行的单个数据项(也就是SearchResults集合里的某一条记录),所以直接绑定SearchResultViewModel.SearchResults会找不到对应的属性。

你可以通过两种方式修正绑定的数据源:


方法1:用ElementName指定主Grid

给主GridControl起个名字,然后在细节Grid里通过这个名字引用主Grid的DataContext:

<dxg:GridControl x:Name="MainSearchGrid" 
                 ItemsSource="{Binding Path=SearchResultViewModel.SearchResults, Mode=OneWay}">
    <dxg:GridControl.DetailDescriptor>
        <dxg:ContentDetailDescriptor>
            <dxg:ContentDetailDescriptor.ContentTemplate>
                <DataTemplate>
                    <!-- 绑定主Grid的DataContext里的SearchResultViewModel.SearchResults -->
                    <dxg:GridControl ItemsSource="{Binding DataContext.SearchResultViewModel.SearchResults, 
                                                           ElementName=MainSearchGrid, 
                                                           Mode=OneWay}">
                        <!-- 在这里添加细节Grid的列配置 -->
                        <dxg:GridControl.Columns>
                            <dxg:GridColumn FieldName="YourField1" />
                            <dxg:GridColumn FieldName="YourField2" />
                        </dxg:GridControl.Columns>
                    </dxg:GridControl>
                </DataTemplate>
            </dxg:ContentDetailDescriptor.ContentTemplate>
        </dxg:ContentDetailDescriptor>
    </dxg:GridControl.DetailDescriptor>
    
    <!-- 主Grid的列配置 -->
    <dxg:GridControl.Columns>
        <dxg:GridColumn FieldName="MainField1" />
        <dxg:GridColumn FieldName="MainField2" />
    </dxg:GridControl.Columns>
</dxg:GridControl>

方法2:用RelativeSource向上查找主Grid

如果不想给主Grid起名字,可以用RelativeSource找到上层的GridControl,再引用它的DataContext:

<dxg:GridControl ItemsSource="{Binding Path=SearchResultViewModel.SearchResults, Mode=OneWay}">
    <dxg:GridControl.DetailDescriptor>
        <dxg:ContentDetailDescriptor>
            <dxg:ContentDetailDescriptor.ContentTemplate>
                <DataTemplate>
                    <dxg:GridControl ItemsSource="{Binding DataContext.SearchResultViewModel.SearchResults, 
                                                           RelativeSource={RelativeSource AncestorType={x:Type dxg:GridControl}}, 
                                                           Mode=OneWay}">
                        <!-- 细节Grid的列配置 -->
                    </dxg:GridControl>
                </DataTemplate>
            </dxg:ContentDetailDescriptor.ContentTemplate>
        </dxg:ContentDetailDescriptor>
    </dxg:GridControl.DetailDescriptor>
    
    <!-- 主Grid的列配置 -->
</dxg:GridControl>

补充说明

两种方法的本质都是绕过细节模板默认的行数据DataContext,回到主Grid的DataContext(也就是你的父ViewModel),从而访问到SearchResultViewModel.SearchResults集合。

如果你的父ViewModel本身就是SearchResultViewModel(而不是包含它的对象),那绑定路径可以简化为{Binding DataContext.SearchResults, ElementName=MainSearchGrid},去掉中间的SearchResultViewModel层级即可。

内容的提问来源于stack exchange,提问作者Kevin Bindig

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:01:24