Удаление строки в просмотре списка с помощью Command + CommandParameter в WPF + MVVM - PullRequest
1 голос
/ 05 августа 2011

Я хочу удалить строку в элементе управления ListView, используя Command и CommandParameter, как показано ниже.

<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>

Я пытаюсь захватить свойство Tag кнопки и передать его в команду, как описано выше, а затем удалить его из списка, как показано ниже.

Отредактировано выше XAML и добавлено TextBlock, который использует ту же привязку, что и Tag и Content для 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);
    }

но я всегда получаю параметр criterionId как ноль.

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 05 августа 2011

Поскольку вы явно устанавливаете DataContext внутри кнопки, при выполнении привязки, такой как {Binding SomeProperty}, будет предполагаться, что SomeProperty находится в DataContext, который вы только что установили. Попробуйте использовать более явную привязку, например:

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

, который даст вам правильный DataContext CriteriaID, как для TextBlock.

0 голосов
/ 05 августа 2011

До тех пор, пока значение Tag вашей кнопки не равно нулю (если оно равно нулю, у вас другая проблема), я не вижу причины, по которой вы не можете напрямую связываться с CriterionId, как с Tag.

...