1

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

<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 属性并将其传递给上面的命令,而不是像这样从列表中删除它。

在 XAML 上方进行了编辑并添加了一个 TextBlock,它使用与 Button 的标记和内容相同的绑定,但不知何故 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);
    }

但我总是将criteriaId参数设为null。

我究竟做错了什么?

4

2 回答 2

0

只要您的按钮Tag不为空(如果它为空,您就会遇到不同的问题),我看不出您不能CriterionId像使用Tag.

于 2011-08-05T16:53:26.900 回答
0

由于您在按钮内显式设置 DataContext,因此当您进行类似绑定{Binding SomeProperty}时,它将假定 SomeProperty 在您刚刚设置的 DataContext 中。尝试使用更明确的绑定,例如:

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

这将为您提供正确的 DataContext,CriteriaID就像TextBlock.

于 2011-08-05T17:22:46.507 回答