C# 如何在列表框中包含按钮并映射其事件?

C# 如何在列表框中包含按钮并映射其事件?,c#,wpf,binding,listbox,C#,Wpf,Binding,Listbox,我有一个关于如何通过列表框显示动态列表的概念问题。在列表框中,项目保存在Stackpanel中。堆栈面板中有一个字符串和一个按钮。如果单击该按钮,则该实体/项目(按钮和字符串)将从列表框中删除 1) 如何根据列表中实体的数量创建新按钮? 2) 如何将此按钮与列表框中的此项目关联起来? 3) 这甚至可以通过绑定实现吗 对不起,我对WPF还是新手,但我开始意识到它非常强大 如果您还可以提供一个简短的例子,或直接给我一个类似的链接,将不胜感激。非常感谢!:) 我想您需要更改控件模板和/或控件的内容模板

我有一个关于如何通过列表框显示动态列表的概念问题。在列表框中,项目保存在Stackpanel中。堆栈面板中有一个字符串和一个按钮。如果单击该按钮,则该实体/项目(按钮和字符串)将从列表框中删除

1) 如何根据列表中实体的数量创建新按钮?
2) 如何将此按钮与列表框中的此项目关联起来?
3) 这甚至可以通过绑定实现吗

对不起,我对WPF还是新手,但我开始意识到它非常强大


如果您还可以提供一个简短的例子,或直接给我一个类似的链接,将不胜感激。非常感谢!:)

我想您需要更改控件模板和/或控件的内容模板。看看下面的链接


希望这有帮助。

这是一个简单的例子,说明了如何做到这一点。首先,ListBox的源类。实现INotifyPropertyChanged接口和一个字符串属性的简单类

public class MyClass : INotifyPropertyChanged
{
    public MyClass(string myString)
    {
        MyString = myString;
    }
    private string m_myString;
    public string MyString
    {
        get
        {
            return m_myString;
        }
        set
        {
            m_myString = value;
            OnPropertyChanged("MyString");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
主窗口具有MyClass的ObservableCollection。我们将窗口的DataContext设置为自身(这将使ListBox继承DataContext,以便我们可以将其ItemsSource绑定到MyClass

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        MyClasses = new ObservableCollection<MyClass>();
        MyClasses.Add(new MyClass("My String 1"));
        MyClasses.Add(new MyClass("My String 2"));
        MyClasses.Add(new MyClass("My String 3"));
        this.DataContext = this;
    }

    public ObservableCollection<MyClass> MyClasses
    {
        get;
        private set;
    }
}
<ListBox ItemsSource="{Binding MyClasses}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding MyString}" Margin="6"/>
                <Button Content="Remove"
                        Click="RemoveListBoxItem_Click"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
private void RemoveListBoxItem_Click(object sender, RoutedEventArgs e)
{
    // The clicked Button
    Button button = sender as Button;
    // The DataContext of the Button will be its instance of MyClass
    MyClass selectedItem = button.DataContext as MyClass;
    if (selectedItem != null)
    {
        // Remove the MyClass item from the collection
        MyClasses.Remove(selectedItem);
    }
}