我想对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。
预先感谢
答案 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/