我的MVVM WPF实现中有一个ListView,它有一个带有按钮的DataTemplate。 ListView绑定到ViewModel中的一组复杂对象。
<ListView ItemsSource="{Binding Path=ComplexObjects}"
SelectedItem="{Binding Path=SelectedObject}"
Width="Auto">
<ListView.View>
<GridView>
<GridViewColumn Header="My Property">
<GridViewColumn.CellTemplate>
<DataTemplate>
<StackPanel Margin="6,2,6,2">
<TextBlock Text="{Binding MyProperty}"/>
</StackPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="First Name">
<GridViewColumn.CellTemplate>
<DataTemplate>
<StackPanel Margin="6,2,6,2">
<Button Command="{Binding ???}"/>
</StackPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
所有文本字段都没有问题,但是我可以将Button Command绑定到ComplexObject的成员方法吗?如果有,有什么方法可以传递参数吗?
我有一种感觉,我可能只是在逃避使用ICommand。
感谢。
答案 0 :(得分:5)
您可以在ViewModel上绑定ICommand
,传递实例以作为参数调用方法。然后,ViewModel可以在右侧ComplexObject
调用适当的方法。
例如:
<DataTemplate>
<StackPanel Margin="6,2,6,2">
<Button Command="{Binding DoSomethingCommand, RelativeSource={RelativeSource AncestorType={x:Type ViewModelType}, Mode=FindAncestor}" CommandParameter="{Binding}"/>
</StackPanel>
</DataTemplate>
然后视图模型可能如下所示:
public ICommand DoSomethingCommand
{
get { return new DelegateCommand<object>(DoSomething); }
}
private void DoSomething(object instance)
{
var complexObject = instance as ComplexObject;
if (complexObject != null)
complexObject.SomeMethod();
}
答案 1 :(得分:2)
如果你真的想变得疯狂,我想你可以使用delegate
的依赖属性创建自己的按钮自定义控件,然后绑定到返回相同类型{{1}的属性}}。然后在您的自定义控件类中,您可以在单击它时调用该委托。
总有标准的ICommand,如果你走这条路,这就是......
delegate
使用他的blog post中的Kent Boogaart的DelegateCommand类。 然后...
在您绑定的课程中:
<Button Command={Binding CommandProperty} />
答案 2 :(得分:0)
对于Button,您将需要使用在ComplexObject中建立的ICommand:
<Button Command="{Binding Path = CommandName}"/>
如果您的方法位于View Model中,该模型包含您的控件或窗口 Me 的ComplexObjects集合名称,并使用以下内容:
<Button Command="{Binding ElementName=Me, Path=DataContext.CommandName}" />
您可以使用单击或预览鼠标,但如果您想要在XAML中绑定方法,则仍需要将该事件路由到命令。绑定命令会更容易。