【发布时间】:2019-08-21 14:39:18
【问题描述】:
我想对 WPF 中具有父子关系的 DataGrid 中的分层数据执行 CRUD 操作。为了显示子网格,我使用了一个 RowDetailsTemplate 设置为 StaticResource 的数据网格。作为上下文,我将 MVVM 模式与 Prism 框架和 Telerik 控件一起使用。
我已将两个子数据视图放在数据模板中的选项卡控件中。该应用程序完美地显示数据。我的问题是子网格中的事件没有绑定到 ViewModel 中的相应委托命令。我试图以不同的方式绑定子数据网格中的事件无济于事(在下面的代码中注释掉)。
我怀疑它与 Prism ViewModelLocator.AutoWireViewModel 有关,因为我在输出窗口中遇到的绑定错误没有像我预期的那样引用我的 ViewModel。 (Location_14A...而不是LocationViewModel)
System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“Location_14A7828CEC09716B3DA7369A214EE4EE12A5B3DF727D10928AAFA56EF30AA046”(HashCode=59884855)上找不到“BeginEditCommand”属性。 BindingExpression:Path=SubBeginEditCommand; DataItem='Location_14A7828CEC09716B3DA7369A214EE4EE12A5B3DF727D10928AAFA56EF30AA046' (HashCode=59884855);目标元素是“EventBinding”(HashCode=66128121);目标属性是“Command”(输入“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>
我希望在子数据网格中开始编辑时调用委托命令,就像在父数据网格中开始编辑时一样。
提前致谢
【问题讨论】:
-
您能否实际显示使用
ViewModelLocator的代码,因为您怀疑它会导致问题?