使用DevExpress Master-Detail网格,我如何绑定到子网格中的SelectedItem

本文关键字:网格 绑定 SelectedItem Master-Detail DevExpress 何绑定 使用 | 更新日期: 2023-09-27 17:50:18

注:此条目的类型为"分享您的知识,问答Style"。我在下面回答我自己的问题

不幸的是,在带有Master-Detail的DevExpress网格中,SelectedItem不能在子网格上工作。

如何确定子网格中选择了哪个项目?

使用DevExpress Master-Detail网格,我如何绑定到子网格中的SelectedItem

这已被取代:-

请注意,这种方法是过时的从15.1版本开始,在那里绑定主网格和细节网格的选择的能力是开箱即用的。从那个版本开始,直接绑定CurrentItem/SelectedItem/SelectedItems属性,就像Master-detail grid中描述的那样——添加绑定选择和导航属性的功能。

主-细节网格的以下属性现在支持绑定: SelectedItem, CurrentItem, SelectedItems 。指定DataControlDetailDescriptor.ParentPath属性或处理DataControlDetailDescriptor.CustomGetParent事件以启用从ViewModel到网格的绑定。

注:此条目的类型为"分享您的知识,问答风格"。

经过一段时间的挣扎,我发现解决这个问题的最好方法是创建自己的附加属性,按照这些说明:

https://www.devexpress.com/Support/Center/Example/Details/E4402

下面是一些示例代码,展示了它是如何工作的。方法取决于DevExpress库的版本,如上面的链接所示。
<grid:GridControl x:Name="BasketSearchBasketGrid" ItemsSource="{Binding Path=Baskets}" ToolTip="Double click to show details.">
    <grid:GridControl.InputBindings>
        <MouseBinding MouseAction="LeftDoubleClick" Command="{Binding Path=SelectRowCmd}"/>
    </grid:GridControl.InputBindings>
    <grid:GridControl.View>
        <grid:TableView x:Name="view" AllowPerPixelScrolling="True" AutoWidth="True" NewItemRowPosition="None"
                            DetailHeaderContent="Search Results"
                            NavigationStyle="Row"
                            ShowFixedTotalSummary="False"
                            ShowGroupPanel="True"
                            ShowGroupedColumns="True"
                            ShowAutoFilterRow="false"
                            FadeSelectionOnLostFocus="False"
                            ShowIndicator="False"
                            BestFitMode="AllRows">
            <i:Interaction.Behaviors>
                <!-- We could use SelectedRow, however, to keep things consistent with the way child rows work, use this
                instead. -->
                <devExpressBehaviour:MasterFocusedRowBehavior FocusedRow="{Binding SelectedBasket, Mode=TwoWay}" />
            </i:Interaction.Behaviors>
        </grid:TableView>
    </grid:GridControl.View>
    <grid:GridControl.Columns>
        <grid:GridColumn Header="Basket Name" FieldName="BasketName" MinWidth="60"/>
        <grid:GridColumn Header="BasketStyle" FieldName="BasketStyle" MinWidth="40"/>
    </grid:GridControl.Columns>
    <grid:GridControl.DetailDescriptor>
        <dxg:DataControlDetailDescriptor ItemsSourcePath="Orders" ShowHeader="False">
            <grid:GridControl x:Name="BasketSearchOrderGrid" Tag="orderDetails"                                                      
                    >
                    <grid:GridControl.Columns>
                        <grid:GridColumn Header="Side" FieldName="Side" MinWidth="20"/>
                        <!-- More columns here -->
                    </grid:GridControl.Columns>
                    <grid:GridControl.View>
                    <dxg:TableView ShowGroupPanel="False">
                        <i:Interaction.Behaviors>
                            <!-- DevExpress does not support SelectedRow on a child grid. Use this custom behavior instead. -->
                            <devExpressBehaviour:DetailFocusedRowBehavior FocusedRow="{Binding SelectedOrder, Mode=TwoWay}" />
                        </i:Interaction.Behaviors>
                    </dxg:TableView>
                </grid:GridControl.View>
                </grid:GridControl>
        </dxg:DataControlDetailDescriptor>
    </grid:GridControl.DetailDescriptor>
</grid:GridControl>

关键是这些行,在子网格的<TableView>选项卡内。这些有效地用实际工作的附加属性代替了跟踪所选项(即SelectedItem)的非工作方法。

<i:Interaction.Behaviors>
    <!-- DevExpress does not support SelectedRow on a child grid. Use this custom behavior instead. -->
    <devExpressBehaviour:DetailFocusedRowBehavior FocusedRow="{Binding SelectedOrder, Mode=TwoWay}" />
</i:Interaction.Behaviors>

请DevExpress,让我们轻松,这应该只是工作!