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 プロパティを取得して、上記のように Command に渡し、リストから削除しようとしています。

XAMLの上で編集し、ボタンのタグとコンテンツと同じバインディングを使用するTextBlockを追加しましたが、どういうわけかボタンは値を取得しませんが、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

ボタン内で DataContext を明示的に設定しているため、次のようなバインディングを行うと、設定{Binding SomeProperty}した DataContext に SomeProperty があると想定されます。次のようなより明示的なバインディングを使用してみてください。

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

CriteriaIDこれにより、 のように正しい DataContext が得られますTextBlock

于 2011-08-05T17:22:46.507 に答える
0

ボタンが null でない限り(null の場合は別の問題があります)、 のようにTag直接バインドできない理由はわかりません。CriterionIdTag

于 2011-08-05T16:53:26.900 に答える