You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF技术问题:点击按钮时如何获取列表中的当前Article对象

问题描述

点击红色“X”按钮时,希望从ObservableCollection中删除对应的Article对象,但不知道如何获取当前的Article对象。已定义Article类,并有存储不同Article对象的列表。

XAML代码
<ItemsControl ItemsSource="{Binding CartArticles}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Border BorderBrush="Black" BorderThickness="2" CornerRadius="30,30,30,30" Margin="0,15,0,30" MinWidth="100" MaxWidth="600" >
                <Grid Margin="0,0,0,10" Grid.Row="0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition />
                        <ColumnDefinition />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                    <Image Width="100" Height="70" Source="{Binding PathPic}" Margin="0,10,0,0"/>
                    <TextBlock FontWeight="Bold" Grid.Column="1" FontSize="17" HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding Name}"/>
                    <StackPanel Grid.Column="2" HorizontalAlignment="Center" Orientation="Horizontal" VerticalAlignment="Center" >
                        <TextBlock FontWeight="Bold" FontSize="17" Foreground="DimGray" Text="{Binding Quantity}"/>
                        <TextBlock Text=" x " FontSize="16" Foreground="DimGray" />
                        <TextBlock FontWeight="Bold" FontSize="17" Foreground="DimGray" Text="{Binding Price}" />
                        <TextBlock FontWeight="Bold" FontSize="17" Foreground="DimGray" Text=" Euro" />
                    </StackPanel>
                    <StackPanel Grid.Column="2" HorizontalAlignment="Center" Orientation="Horizontal" VerticalAlignment="Bottom" >
                        <TextBlock FontWeight="Bold" Grid.Column="2" FontSize="17" HorizontalAlignment="Center" VerticalAlignment="Bottom" Text="{Binding CompleteArticlePrice}"/>
                        <TextBlock FontWeight="Bold" FontSize="17" Foreground="DimGray" Text=" Euro" />
                    </StackPanel>
                    <Button Name="DeleteCartArticle" Grid.Column="2" Width="20" Height="20" Margin="0,13,20,0" Content="X" FontSize="15" Foreground="Red" Background="Transparent" BorderThickness="0" HorizontalAlignment="Right" VerticalAlignment="Center" Click="DeleteCartArticle_Click"/>
                </Grid>
            </Border>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
ObservableCollection代码
public ObservableCollection<Article> CartArticles { get; set; } = new ObservableCollection<Article>();

public void GetCartArticles()
{
    foreach (var article in _shoppingCartService.CartArticles.ToList())
    {
        CartArticles.Add(new Article
        {
            ArticleId = article.ArticleId,
            Name = article.Name,
            Price = article.Price,
            Quantity = article.Quantity,
            PathPic = article.PathPic,
            CompleteArticlePrice = article.Price * article.Quantity,
        });
    }
}
效果展示

效果展示图

解决方案

方法1:通过Click事件直接获取DataContext

在后台代码的DeleteCartArticle_Click方法中,将按钮的DataContext转换为Article对象,再从集合中移除:

private void DeleteCartArticle_Click(object sender, RoutedEventArgs e)
{
    if (sender is Button button && button.DataContext is Article articleToDelete)
    {
        CartArticles.Remove(articleToDelete);
        // 如需同步到_shoppingCartService的集合,可在此添加对应逻辑
        _shoppingCartService.CartArticles.Remove(articleToDelete);
    }
}

方法2:使用MVVM命令绑定(推荐)

若遵循MVVM模式,建议给按钮绑定ICommand,将当前Article作为命令参数传递:

1. 在ViewModel中定义删除命令

public ICommand DeleteArticleCommand { get; }

// 在ViewModel构造函数中初始化命令
public YourViewModel()
{
    DeleteArticleCommand = new RelayCommand<Article>(DeleteArticle);
}

private void DeleteArticle(Article articleToDelete)
{
    if (articleToDelete != null)
    {
        CartArticles.Remove(articleToDelete);
        _shoppingCartService.CartArticles.Remove(articleToDelete);
    }
}

注:RelayCommand是常用的ICommand实现,可自行编写或使用Prism/MvvmLight等框架提供的版本

2. 修改XAML中的Button绑定

替换原有的Click事件为命令绑定:

<Button Name="DeleteCartArticle" Grid.Column="2" Width="20" Height="20" Margin="0,13,20,0"
        Content="X" FontSize="15" Foreground="Red" Background="Transparent" BorderThickness="0"
        HorizontalAlignment="Right" VerticalAlignment="Center"
        Command="{Binding DataContext.DeleteArticleCommand, RelativeSource={RelativeSource AncestorType=ItemsControl}}"
        CommandParameter="{Binding}" />

通过RelativeSource找到父级ItemsControl的DataContext(即ViewModel),并将当前Article作为命令参数传递。


内容的提问来源于stack exchange,提问作者user22498067

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:43:18