0

我有以下用户控件

<ListBox   ItemsSource="{Binding Persons}" 
           SelectedItem="{Binding SelectedPerson}" 
           VerticalAlignment="Top" Width="166" >
            <ListBox.Template>
                <ControlTemplate>
                    <StackPanel >
                        <ItemsPresenter/>
                        <Button Content="Add" Background="Transparent" Command="{Binding NewItemCommand}"/>
                    </StackPanel>
                </ControlTemplate>
            </ListBox.Template>

            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Button  Height="16" Width="16" Background="Transparent" Command="{Binding DeleteItemCommand}">
                            <Image Source="images/delete-icon.png" />
                        </Button>
                        <TextBlock Text="{Binding Name}"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

我有一个带有两个命令的视图模型,你可以在上面看到的第一个命令NewItemCommand工作正常,但是第二个命令DeleteItemCommand不起作用。

是因为它在项目模板中吗?

4

1 回答 1

2

是的,这是因为DataContextfor theItemTemplate是 Item from Personsnot theViewModel

要绑定DeleteItemCommand每个项目,您需要绑定回ViewModel持有命令的项目

例如,绑定DataContextListBox

<Button Command="{Binding Path=DataContext.DeleteItemCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}" />

编辑:

如果您想删除单击按钮的项目,您可以将按钮所属的项目传递为CommandParameter并在您的命令中处理它,不确定您使用的是什么类型的命令,但如果您使用RelayCommand或这很简单DelegateCommand

 <Button Command="{Binding Path=DataContext.DeleteItemCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}"
         CommandParameter="{Binding}" />

public MainWindow()
{
    InitializeComponent();
    DeleteItemCommand = new RelayCommand(person => DeletePerson(person as Person));
}

private void DeletePerson(Person person)
{
    Collection.Remove(person);
}
于 2013-10-14T03:23:26.793 回答