WPF事件到父子DataGrid中的命令绑定未能绑定子DataGrid事件

时间:2019-08-21 14:39:18

标签: c# wpf mvvm prism

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

我已将两个子数据视图放在数据模板的Tab控件中。该应用程序完美显示数据。我的问题是,子网格中的事件未绑定到ViewModel中的相应Delegate Commands。我试图以不同的方式将子数据网格中的事件绑定无济于事(在下面的代码中进行了注释)。

我怀疑这与Prism ViewModelLocator.AutoWireViewModel有关,因为我在“输出”窗口中遇到的绑定错误没有像我期望的那样引用我的ViewModel。 (Location_14A ...而不是LocationViewModel)

System.Windows.Data错误:40:BindingExpression路径错误:在'object'上找不到'BeginEditCommand'属性''Location_14A7828CEC09716B3DA7369A214EE4EE12A5B3DF727D10928AAFA56EF30AA046'(HashCode = 59884855)'。 BindingExpression:Path = SubBeginEditCommand; DataItem ='Location_14A7828CEC09716B3DA7369A214EE4EE12A5B3DF727D10928AAFA56EF30AA046'(HashCode = 59884855);目标元素是'EventBinding'(HashCode = 66128121);目标属性为'Command'(类型为'ICommand')

奇怪的是,事件在Parent DataGrid中完美地绑定了,所以我确定我忽略了一些小问题。

我的DataTemplate如下:

<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>

我希望当我开始在Child DataGrid中进行编辑时,就像在Parent Data Grid中开始进行编辑时一样,将调用Delegate Command。

预先感谢

2 个答案:

答案 0 :(得分:1)

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

RowDetailsTemplate

答案 1 :(得分:0)

我的猜测是,您在数据网格中的数据上下文错误,至少我遇到了非常相似的问题(巧合的是Telerik和Prism)。 MM8有一个可能有效的解决方案,但如果relativesource不起作用,另一种对我有用的方法是BindingProxy的引入。 这个想法是,您创建一个只保留数据上下文的资源,然后可以将该数据引用为数据网格内的静态资源。

在我的代码中,它看起来像这样:

<UserControl.Resources>
    <ResourceDictionary>
        <helpers:BindingProxy x:Key="DataContextProxy" Data="{Binding}" />
    </ResourceDictionary>
</UserControl.Resources>

和bindind将是:

{Binding Path=Data.BeginEditCommand, Source={StaticResource DataContextProxy}

绑定代理的代码和最初的想法来自此站点: https://thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/