- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个关于如何让列表框显示动态列表的概念问题。在列表框中,项目保存在 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/
我是一名优秀的程序员,十分优秀!