GalaSoft_MvvmLight_Command:ListItem上按钮的EventToCommand?

时间:2011-08-03 20:38:33

标签: silverlight xaml windows-phone-7 mvvm-light

在数据模板中的订单项上连接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而不仅仅是一个成员?

2 个答案:

答案 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。