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