[英]How to get the binded Item from a listbox when a button is clicked
我有一個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
是null,原因是button.DataContext
的類型是CustomButton
,因為我期望它是MyItem
類型。
我錯過了什么,以便按鈕DataContext
將是正確的MyItem
對象? 或者還有什么我可以用來從click事件中獲取綁定項目? 是什么原因導致DataContext
引用自身?
根據OP的要求:
您的CustomButton在XAML中將其DataContext設置為自身:
<Button x:Class="My.CustomButton"
...
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<!-- ... -->
</Button>
或在代碼中:
public CustomButton()
{
DataContext = this;
}
這是錯的。 刪除它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.