在数据模板中的订单项上连接mvvm-light EventToCommand的语法是什么?对于主模型上的操作,如下所示的语法工作正常,但是如果我对数据模板中的行项目进行操作,则绑定不起作用,我需要识别要操作的特定行项目。
在尝试将事件连接到命令之前,我将订单项单击挂钩到XAML代码隐藏中的事件处理程序;处理程序从事件args中提取行项数据对象,然后通过DataContext将行项数据对象传递给方法到视图模型,并且工作正常,但我希望与整个应用程序的处理保持一致。 / p>
输出中的运行时错误: System.Windows.Data错误:BindingExpression路径错误:'Model.LineItem'上找不到'EditLineCommand'属性。 BindingExpression:Path ='EditLineCommand'DataItem ='Model.LineItem'; target元素是'System.Windows.Controls.Button'(Name ='EditRowButton'); target属性是'DependencyPropertyListener39'(类型'System.Object')..
XAML main layout:
<!-- Line Items -->
<ListBox ItemTemplate="{StaticResource LineItemTemplate}" ItemsSource="{Binding Model.LineItems}"/>
XAML data template:
<DataTemplate x:Key="LineItemTemplate">
<Button>
<Image Source="..." />
<Custom:Interaction.Triggers>
<Custom:EventTrigger EventName="Click">
<GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding EditLineCommand, Mode=OneWay}" />
</Custom:EventTrigger>
</Custom:Interaction.Triggers>
</Button>
</DataTemplate>
更新 - 我想我差不多了,@克劳斯的答案通过解决命令绑定问题解决了我的大部分问题。要识别要操作的特定行,我绑定到LineItem的LineNumber,然后在relay命令上拉出该参数:
<GalaSoft_MvvmLight_Command:EventToCommand
Command="{Binding DataContext.DeleteLineCommand, ElementName=DetailPage}"
CommandParameter="{Binding LineNumber}"
PassEventArgsToCommand="True" />
...
public RelayCommand<int> DeleteLineCommand { get; private set; }
...
DeleteLineCommand = new RelayCommand<int>((ln) => { DeleteLineItem(ln); });
这是一个可行的解决方案,但有没有办法绑定到完整的LineItem而不仅仅是一个成员?
答案 0 :(得分:1)
有关如何从数据模板绑定到视图模型的属性(或命令)的讨论,请参阅Bind datagrid to one ViewModel, column / combobox to another。
答案 1 :(得分:0)
魔术:
<phone:PhoneApplicationPage x:Name="MyPage" ... >
...
<GalaSoft_MvvmLight_Command:EventToCommand
Command="{Binding DataContext.EditLineCommand, ElementName=MyPage}" />
...
</phone:PhoneApplicationPage>
这样,它将使用Page的DataContext,它通常是您的ViewModel。