c# - 如何在 ListBox 中包含按钮并映射它们的事件?

标签 c# wpf binding listbox

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

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

抱歉,我对 WPF 还是个新手,但开始发现它非常强大。

如果您还可以提供一个简短的/简短的示例,或者将我指向与此类似的链接,我们将不胜感激。非常感谢! :)

最佳答案

这是一个简单的示例,说明如何执行此操作。首先,ListBox 的源类。一个实现 INotifyPropertyChanged 接口(interface)和一个字符串属性的简单类。

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));
        }
    }
}

MainWindow 有一个 MyClass 的 ObservableCollection。我们将 Window 的 DataContext 设置为其自身 (this),这将使 ListBox 继承 DataContext,因此我们可以将其 ItemsSource 绑定(bind)到 MyClasses。

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;
    }
}

在 xaml 中,我们有绑定(bind)到 MyClasses 的 ListBox。 ItemTemplate 适用于 ListBox 中的每个 ListBoxItem,每个项目绑定(bind)到它的 MyClass 实例,呈现 MyString 属性和一个“删除按钮”。每个 ListBoxItem 的 DataContext 将是 MyClass 的一个实例。

<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>

最后,我们在 MainWindow.xaml.cs 中为 RemoveListBoxItem_Click 添加 EventHanlder 背后的代码。

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);
    }
}

关于c# - 如何在 ListBox 中包含按钮并映射它们的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4311934/

相关文章:

c# - DataGrid 更新添加的行但不更新添加的列

wpf - 将实现与模式的某些部分匹配

wpf - 更改复选框大小 WPF

wpf - 如何从 WPF 中的另一个窗口绑定(bind)到 MainWindow 中的控件?

c# - WPF ListBoxItem 样式是否覆盖了我的 ItemTemplate?

c# - 类总是尝试在设计 View 中打开,而不是代码 View

c# - Entity Framework 6 模拟包含 dbset 上的方法

c# - WPF 中 CheckBox 的自定义鼠标命中区域

java - 如何将通用 bean 的属性绑定(bind)到动态创建的 swing 组件

ios - View 层次结构中的 Mvvm 交叉绑定(bind)