使用WPF + MVVM中的Command + CommandParameter删除listview中的行

时间:2011-08-05 16:46:14

标签: wpf listview command commandparameter

我想使用Command和CommandParameter删除ListView Control中的一行,如下所示。

<GridViewColumn Header="X">
<GridViewColumn.CellTemplate>
    <DataTemplate>
        <StackPanel>
           <TextBlock Text="{Binding CriteriaId}"/>
           <Button Name="btnDeleteCriterion" Tag="{Binding CriteriaId}" Content="{Binding CriteriaId}" Foreground="Red" FontWeight="Bold" 
                                                             Command="{Binding DeleteCriterionCommand}" 
                                                                        DataContext="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType=ListView}}"
                                                             CommandParameter="{Binding RelativeSource={RelativeSource self}, Path=Tag}"
                                                                        />
        <StackPanel>
    </DataTemplate>
</GridViewColumn.CellTemplate>

我试图获取Button的Tag属性并将其传递给Command,如上所述,然后将其从列表中删除。

  

编辑,在XAML之上并添加了一个TextBlock,它使用与Button的Tag和Content相同的绑定,但不知何故Button没有得到值,但TextBlock会这样做??

    public void DeleteCriterion(object criterionId)
    {
        int crtId = (int)criterionId;
        Criterion crt = _criteria.FirstOrDefault((c) => c.CriterionId == crtId);
        if (crt != null)
            _criteria.Remove(crt);
    }

但我总是将criterionId参数作为null。

我做错了什么?

2 个答案:

答案 0 :(得分:0)

只要您的按钮Tag不为空(如果它为空,则您有其他问题),我没有看到您无法直接绑定到CriterionId的原因就像你使用Tag一样。

答案 1 :(得分:0)

由于您在按钮中明确设置DataContext,因此当您执行{Binding SomeProperty}之类的绑定时,它会假定SomeProperty位于您刚刚设置的DataContext中。尝试使用更明确的绑定,如:

"{Binding RelativeSource={RelativeSource AncestorType=StackPanel}, Path=DataContext.CriteriaId}" 

它会为CriteriaID提供正确的DataContext TextBlock