【发布时间】:2011-08-03 20:38:33
【问题描述】:
在数据模板中的行项目上连接 mvvm-light EventToCommand 的语法是什么?对于主模型上的操作,如下所示的语法可以正常工作,但是如果我正在对数据模板中的行项目进行操作,则绑定不起作用,我需要识别要操作的特定行项目.
在尝试将事件连接到命令之前,我已将行项 click 连接到 XAML 代码隐藏中的事件处理程序;处理程序从事件 args 中提取行项目数据对象,然后通过 DataContext 将行项目数据对象传递给一个方法到视图模型并且工作正常,但我希望与整个应用程序的处理保持一致。
输出中的运行时错误: System.Windows.Data 错误:BindingExpression 路径错误:在“Model.LineItem”上找不到“EditLineCommand”属性。 BindingExpression: Path='EditLineCommand' DataItem='Model.LineItem';目标元素是 'System.Windows.Controls.Button' (Name='EditRowButton');目标属性是“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>
更新 - 我想我快到了,@Claus 的回答通过解决命令绑定问题让我获得了大部分的帮助。为了识别要操作的特定线路,我绑定到 LineItem 的 LineNumber,然后在中继命令中拉出该参数:
<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 而不仅仅是一个成员?
【问题讨论】:
-
请注意,在 WP7.5 (Mango) 中,您可以直接在 Button 类上使用 Command 绑定,而不是使用 EventToCommand。
-
@Claus Jørgensen 并没有解决绑定范围的问题。
-
哦,没错,但这很容易,我不认为这是一个问题。我添加了一个答案,详细说明了它是如何轻松解决的。
标签: silverlight xaml windows-phone-7 mvvm-light