C# 父-子DataGrid中的WPF事件到命令绑定无法绑定子DataGrid事件

C# 父-子DataGrid中的WPF事件到命令绑定无法绑定子DataGrid事件,c#,wpf,mvvm,prism,C#,Wpf,Mvvm,Prism,我想对WPF中具有父子关系的DataGrid中的分层数据执行CRUD操作。为了显示子网格,我使用的数据网格将RowDetailsTemplate设置为StaticResource。作为上下文,我将MVVM模式与Prism框架和Telerik控件结合使用 我已将两个子数据视图放在数据模板的选项卡控件中。应用程序完美地显示了数据。我的问题是子网格中的事件没有绑定到ViewModel中相应的代理命令。我曾尝试以不同的方式绑定子数据网格中的事件,但在下面的代码中注释无效 我怀疑这与Prism ViewM

我想对WPF中具有父子关系的DataGrid中的分层数据执行CRUD操作。为了显示子网格,我使用的数据网格将RowDetailsTemplate设置为StaticResource。作为上下文,我将MVVM模式与Prism框架和Telerik控件结合使用

我已将两个子数据视图放在数据模板的选项卡控件中。应用程序完美地显示了数据。我的问题是子网格中的事件没有绑定到ViewModel中相应的代理命令。我曾尝试以不同的方式绑定子数据网格中的事件,但在下面的代码中注释无效

我怀疑这与Prism ViewModelLocator.AutoWireViewModel有关,因为我在输出窗口中遇到的绑定错误没有像我预期的那样引用我的ViewModel。地点(14A)。。。与LocationViewModel相反

System.Windows.Data错误:40:BindingExpression路径错误:“对象”位置上未找到“BeginEditCommand”属性\u 14A7828CEC09716B3DA7369A214EE12A5B3DF727D10928AAFA56EF30AA046“HashCode=59884855”。BindingExpression:Path=SubBeginEditCommand;DataItem='Location'-U 14A7828CEC09716B3DA7369A214EE12A5B3DF727D10928AAFA56EF30AA046'哈希代码=59884855;目标元素为'EventBinding'HashCode=66128121;目标属性为“命令”类型“ICommand”

奇怪的是,事件在父数据网格中完美绑定,所以我确信我忽略了一些小的东西

我的数据模板如下:

<DataTemplate x:Key="RowDetailsTemplate">
                <telerik:RadTabControl>
                    <telerik:RadTabItem Header="Bins">
                        <telerik:RadGridView Name ="bins"
                                     ItemsSource="{Binding Bins, Mode=TwoWay}">

                            <i:Interaction.Triggers>
                                <i:EventTrigger EventName="BeginningEdit">
                                    <i:InvokeCommandAction Command="{Binding BeginEditCommand}"/>
                                </i:EventTrigger>
                            </i:Interaction.Triggers>

                            <!--<telerik:EventToCommandBehavior.EventBindings>
                                <telerik:EventBinding Command="{Binding BeginEditCommand}" EventName="BeginningEdit"  PassEventArgsToCommand="True"/>
                            </telerik:EventToCommandBehavior.EventBindings>-->

                            <telerik:RadGridView.Columns>
                                <telerik:GridViewDataColumn Header="Description" DataMemberBinding="{Binding Description, Mode=TwoWay}"/>
                            </telerik:RadGridView.Columns>
                        </telerik:RadGridView>
                    </telerik:RadTabItem>
                </telerik:RadTabControl>
            </DataTemplate>
我的父网格视图只是:

        <telerik:RadGridView Grid.Row ="0"
                             Name ="MainGridView"
                             ItemsSource="{Binding MainCollection, Mode=TwoWay}"
                             AutoGenerateColumns="False"
                             SelectedItem="{Binding SelectedRecord, Mode=TwoWay}"
                             SelectionMode="Extended"
                             RowDetailsTemplate="{StaticResource RowDetailsTemplate}">

            <telerik:EventToCommandBehavior.EventBindings>
                <telerik:EventBinding Command="{Binding BeginEditCommand}" EventName="BeginningEdit"  PassEventArgsToCommand="True"/>
            </telerik:EventToCommandBehavior.EventBindings>

            <telerik:RadGridView.Columns>
                <telerik:GridViewToggleRowDetailsColumn/>
                <telerik:GridViewDataColumn Header="Location Id" 
                                            DataMemberBinding="{Binding Id, Mode=OneWay}" 
                                            IsReadOnly="True"/>
              <!--Removed for Bevity-->
            </telerik:RadGridView.Columns>
        </telerik:RadGridView>
我希望当我开始在子数据网格中编辑时,会调用委托命令,就像我开始在父数据网格中编辑时一样

提前感谢

如果您有一个BeginEditCommand属性,该属性与RadGridView绑定到的Bins属性在同一个类中定义,则此绑定应在RowDetailsTemplate中工作:


我的猜测是,您在datagrid中处于错误的datacontext中,至少我在Telerik和Prism中遇到了非常相似的问题。MM8有一个可能有效的解决方案,但如果relativesource不起作用,另一个对我有效的方法是引入BindingProxy。 其思想是创建一个只包含datacontext的资源,然后可以在datagrid中将此资源作为静态资源引用

在我的代码中,它如下所示:

<UserControl.Resources>
    <ResourceDictionary>
        <helpers:BindingProxy x:Key="DataContextProxy" Data="{Binding}" />
    </ResourceDictionary>
</UserControl.Resources>
绑定代理的代码和原始想法来自此站点:

如果您怀疑ViewModelLocator会导致问题,您是否可以实际显示使用ViewModelLocator的代码?谢谢,我最初尝试此选项时所犯的错误不是在telerik中正确地为AncestorType添加前缀:因此,如果在可视树中找不到它,我认为这是完全合乎逻辑的。愚蠢的错误这是个好主意,我一定会派上用场的。MM8的解决方案在这个场景中是一个简单的修复,因为我处于正确的数据上下文中。
<UserControl.Resources>
    <ResourceDictionary>
        <helpers:BindingProxy x:Key="DataContextProxy" Data="{Binding}" />
    </ResourceDictionary>
</UserControl.Resources>
{Binding Path=Data.BeginEditCommand, Source={StaticResource DataContextProxy}