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

tri*_*dev 2 c# data-binding wpf listview 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>
Run Code Online (Sandbox Code Playgroud)

所有文本字段都没有问题,但是我可以将Button Command绑定到ComplexObject的成员方法吗?如果是这样,有什么方法可以传递参数?

我有一种感觉,我可能只是在逃避使用ICommand.

谢谢.

Luk*_*oid 5

您可以ICommand在ViewModel上绑定一个,传递实例以作为参数调用方法.然后,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>
Run Code Online (Sandbox Code Playgroud)

然后viewmodel看起来像这样:

public ICommand DoSomethingCommand
{
    get { return new DelegateCommand<object>(DoSomething); }
}

private void DoSomething(object instance)
{
    var complexObject = instance as ComplexObject;
    if (complexObject != null)
        complexObject.SomeMethod();
}
Run Code Online (Sandbox Code Playgroud)