我想使用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。
我做错了什么?
答案 0 :(得分:0)
只要您的按钮Tag
不为空(如果它为空,则您有其他问题),我没有看到您无法直接绑定到CriterionId
的原因就像你使用Tag
一样。
答案 1 :(得分:0)
由于您在按钮中明确设置DataContext,因此当您执行{Binding SomeProperty}
之类的绑定时,它会假定SomeProperty位于您刚刚设置的DataContext中。尝试使用更明确的绑定,如:
"{Binding RelativeSource={RelativeSource AncestorType=StackPanel}, Path=DataContext.CriteriaId}"
它会为CriteriaID
提供正确的DataContext TextBlock
。