当前位置:  开发笔记 > 编程语言 > 正文

ListBox中的TextBox,Button和ListBox

如何解决《ListBox中的TextBox,Button和ListBox》经验,为你挑选了1个好方法。

我有一个列表框,每个列表项中都有一堆控制.


    
        
            
                
                
                    
                        
                            
                                
                            
                        
                    
                
                
                

当我单击列表框中的按钮时,我想将新项目添加到列表框中的列表框中.我走到这一步.所以我的问题是如何获取文本框以及如何更新列表框?

这是我的点击事件

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

感谢名单



1> Andy..:

最简单的解决方案可能是让一个对象代表外部ListBox中的每个项目.然后它将具有表示项目中每个控件的属性 - TextBox中的文本,以及ListBox中的项目(我认为,基于Click处理程序的任务列表).

在Click处理程序中,您可以获取Button的DataContext(应该是外部列表集合中的项),并将新任务添加到该对象的任务列表中.由于内部ListBox绑定到该列表,因此应使用新项更新它(假设它在添加项时发送事件,例如使用ObservableCollection).

更新:根据您的意见,以下内容应该有效.

你的Project班级应该有两个属性:

class Project
{
    public string Name { get; set; }

    private ObservableCollection tasks =
        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 ObservableCollection projects =
        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中,应修改绑定以绑定到上述属性:


    
        
            
                
                
                
                

最后,在按钮的单击处理程序中,创建任务.的DataContextButton将是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 的实例.这对你有用吗?

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有