单击按钮时如何从列表框中获取绑定的项目

时间:2014-01-30 16:18:27

标签: c# wpf binding

我有一个ListBox控件,其中包含许多项(这些是UserControls),ItemsSource绑定到ObservableCollection。所有这一部分都运行良好,ListBox根据需要显示集合中的每个项目。

但是,我想在每个用户控件旁边放置一个“删除”按钮,这样当用户单击该按钮时,该项将从列表中删除。经过一些研究,以及我自己解决这个问题的几次尝试,我目前得到了以下代码:

XAML:

<ListBox ItemsSource="{Binding Path=MyItems}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <c:MyControl Text="{Binding Path=ItemText}" />
                <c:CustomButton Text="Remove" Click="RemoveButton_Click"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

.CS:

public ObservableCollection<MyItem> MyItems { get; set; }

private void RemoveButton_Click(object sender, RoutedEventArgs e)
{
    var button = sender as CustomButton;
    var item = button.DataContext as MyItem;
    MyItems.Remove(item);
}

我遇到的问题是item为空,原因是button.DataContext的类型为CustomButton,因为我期望它是MyItem类型{ {1}}。

我缺少什么,以便按钮DataContext将是正确的MyItem对象?或者还有什么我可以用来从click事件中获取绑定项目?什么原因导致DataContext引用自己?

1 个答案:

答案 0 :(得分:2)

根据OP的要求:

您的CustomButton将其DataContext设置为自身,在XAML中:

<Button x:Class="My.CustomButton"
        ...
        DataContext="{Binding RelativeSource={RelativeSource Self}}">
   <!-- ... -->
</Button>

或代码:

public CustomButton()
{
   DataContext = this;
}

这是错误的。删除它。