如何将Button命令绑定到成员方法?

时间:2012-02-03 15:16:42

标签: c# wpf listview data-binding mvvm

我的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。

感谢。

3 个答案:

答案 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中绑定方法,则仍需要将该事件路由到命令。绑定命令会更容易。