我有一个列表框,每个列表项中都有一堆控制.
当我单击列表框中的按钮时,我想将新项目添加到列表框中的列表框中.我走到这一步.所以我的问题是如何获取文本框以及如何更新列表框?
这是我的点击事件
private void ButtonAddNewTask_Click(object sender, RoutedEventArgs e) { Button button = (Button)sender; Project proj = button.DataContext as Project; if(proj.Tasks == null) proj.Tasks = new List(); proj.Tasks.Add(new Task("Added Task")); }
感谢名单
最简单的解决方案可能是让一个对象代表外部ListBox中的每个项目.然后它将具有表示项目中每个控件的属性 - TextBox中的文本,以及ListBox中的项目(我认为,基于Click处理程序的任务列表).
在Click处理程序中,您可以获取Button的DataContext(应该是外部列表集合中的项),并将新任务添加到该对象的任务列表中.由于内部ListBox绑定到该列表,因此应使用新项更新它(假设它在添加项时发送事件,例如使用ObservableCollection).
更新:根据您的意见,以下内容应该有效.
你的Project
班级应该有两个属性:
class Project { public string Name { get; set; } private ObservableCollectiontasks = new ObservableCollection (); public IList Tasks { get { return this.tasks; } } }
该Task
班只是有一个属性-任务的名称.
该ProjectView
课程是课堂上的一个包装Project
(我从@ timothymcgrath的回答中得到了这个想法).它跟踪新任务的名称和当前Project
:
class ProjectView : INotifyPropertyChanged { public Project Project { get; set; } private string newTaskName = string.Empty; public string NewTaskName { get { return this.newTaskName; } set { this.newTaskName = value; this.OnPropertyChanged("NewTaskName"); } } public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propName) { PropertyChangedEventHandler eh = this.PropertyChanged; if(null != eh) { eh(this, new PropertyChangedEventArgs(propName)); } } }
你需要一个新的类作为DataContext
.像这样的东西:
class Model { private ObservableCollectionprojects = new ObservableCollection (); public IList Projects { get { return this.projects; } } }
在后面的代码中,将DataContext
对象设置为上述类的实例:
public class Window1 { public Window1() { this.InitializeComponent(); this.DataContext = this.model; } private Model model = new Model(); }
在XAML中,应修改绑定以绑定到上述属性:
最后,在按钮的单击处理程序中,创建任务.的DataContext
的Button
将是ProjectView
该项目.
private void ButtonAddNewTask_Click(object sender, RoutedEventArgs e) { Button btn = (Button)sender; ProjectView curProject = btn.DataContext as Project; if(null != curProject) { curProject.Project.Tasks.Add(new Task() { Name = curProject.NewTaskName }); } }
由于所有控件都通过绑定获取其值,因此您无需访问控件本身即可获取数据 - 只需使用已提供控件的数据结构即可.
将创建Task的代码移动到另一个类(可能Project
)可能会更好,但我只是将它留在事件处理程序中以便于我打字.
更新2:修改了上面的代码,将NewTaskName
属性移动到一个单独的类中,该类包装了一个Project
用于UI 的实例.这对你有用吗?