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
相关产品推荐
相关产品推荐

