将命令绑定到ItemsControl中的按钮时出错。
这是我的代码:
<phone:PhoneApplicationPage.DataContext>
<ViewModel:MyViewModel />
</phone:PhoneApplicationPage.DataContext>
with:
<ItemsControl ItemsSource="{Binding MyList}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="Test"
cmd:ButtonBaseExtensions.Command="{Binding MyViewModel.TestCommand}"
cmd:ButtonBaseExtensions.CommandParameter="{Binding}"/>
</ItemsControl.ItemTemplate>
</ItemsControl>
我得到了:
System.Windows.Data Error: BindingExpression path error: 'MyViewModel' property not found on '...' '...' (HashCode=77119633). BindingExpression: Path='MyViewModel.ChooseCommand' DataItem='...' (HashCode=77119633); target element is 'System.Windows.Controls.Button' (Name=''); target property is 'Command' (type 'System.Windows.Input.ICommand')..
当然,我应该使用绝对绑定或相对绑定,但我不知道该怎么做。
提前感谢您提供任何帮助
答案 0 :(得分:1)
您的Button
位于ItemsControl
范围内,该MyList
属于youur IEnumerable
属性,我猜这是一个List或某种DataContext
类型。每个Button
的{{1}}将是其代表的MyList
内的项目。
你是正确的,要将按钮绑定到顶级视图模型,您需要某种相对源绑定,Silverlight(3)不支持。
我在这里为Silverlight创建了一个相对源代码绑定替换:
http://www.scottlogic.co.uk/blog/colin/2009/02/relativesource-binding-in-silverlight/
然而,对于性能非常重要的WP7,我不会使用它!
为什么不在视图模型中简单地创建所需的关系?即对于MyList
中的每个项目(让我们称之为MyListItem
),公开一个指向父视图模型的属性。换句话说,拥有MyListItem.Parent
属性,该属性指向MyViewModel
。