我有一个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
引用自己?
答案 0 :(得分:2)
根据OP的要求:
您的CustomButton将其DataContext设置为自身,在XAML中:
<Button x:Class="My.CustomButton"
...
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<!-- ... -->
</Button>
或代码:
public CustomButton()
{
DataContext = this;
}
这是错误的。删除它。