C# 如何创建对象并使用按钮单击事件将其添加到列表中?

C# 如何创建对象并使用按钮单击事件将其添加到列表中?,c#,wpf,C#,Wpf,我有一个UI,允许用户通过输入名称和属性来创建“Bird”类的自定义对象。我需要一个按钮来添加新创建的鸟类到“鸟类列表”。我的代码应该是什么样子 Bird类有一个子类“Nest”。鸟类可以有多个巢穴,因此有一个巢穴列表 我目前有以下代码,但不起作用: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Sy

我有一个UI,允许用户通过输入名称和属性来创建“Bird”类的自定义对象。我需要一个按钮来添加新创建的鸟类到“鸟类列表”。我的代码应该是什么样子

Bird类有一个子类“Nest”。鸟类可以有多个巢穴,因此有一个巢穴列表

我目前有以下代码,但不起作用:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Xml;
using System.Xml.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Windows.Media.Media3D;
using System.Xml.Serialization;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace NewBird
{
public partial class MainWindow : Window
 {
        public MainWindow()
 {

    }

    List<Bird> BirdList = new List<Bird>();
    Bird bx = new Bird();
    List<Bird.Nest> NList = new List<Bird.Nest>();

    private void AddNewBird_Click(object sender, RoutedEventArgs e)
    {
        Process tempBird = new Process();     
        string tempName = birdtextbox.Text;
    }


    private void AddNewNest_Click(object sender, RoutedEventArgs e)
    {
        Bird.Nest tempNest = new Bird.Nest();
        NList.Add(tempNest);
    }

    private void Add2List_Click(object sender, RoutedEventArgs e)
    {
        Bird holder = new Bird();
        holder= bx;
        holder.nl = NList;
        BirdList.Add(holder);
        }
    }
}    



public class Bird
    {
        public string BirdName { get; set; }
        public List<Nest> nl { get; set; }
        public Nest nest{ get; set; }
    [Serializable()]
        public class Nest
        {
            public int Number { get; set; }
        }
    }
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.IO;
使用System.Xml;
使用System.Xml.Linq;
使用System.Runtime.Serialization.Formatters.Binary;
使用System.Windows.Media.Media3D;
使用System.Xml.Serialization;
使用System.Windows;
使用System.Windows.Controls;
使用System.Windows.Data;
使用System.Windows.Documents;
使用System.Windows.Input;
使用System.Windows.Media;
使用System.Windows.Media.Imaging;
使用System.Windows.Navigation;
使用System.Windows.Shapes;
新鸟
{
公共部分类主窗口:窗口
{
公共主窗口()
{
}
List BirdList=新列表();
鸟bx=新鸟();
List NList=新列表();
私有void AddNewBird\u单击(对象发送者,路由目标e)
{
进程tempBird=新进程();
字符串tempName=birdtextbox.Text;
}
私有void AddNewNest\u单击(对象发送方,路由目标)
{
Bird.Nest tempNest=新的Bird.Nest();
NList.Add(tempNest);
}
私有void add2列表\u单击(对象发送者,路由目标)
{
鸟托=新鸟();
持有人=bx;
holder.nl=NList;
添加鸟名单(持有人);
}
}
}    
公鸡
{
公共字符串BirdName{get;set;}
公共列表nl{get;set;}
公共嵌套{get;set;}
[可序列化()]
公共类鸟巢
{
公共整数{get;set;}
}
}

“Add2List\u Click”覆盖以前的鸟,而不是将新鸟添加到鸟列表中。

以下是当前代码的功能:

private void add2列表\u单击(对象发送者,路由目标)
{
//创建一个新的Bird并将其放入'holder'变量中,目前为止效果良好。
鸟托=新鸟();
//将“holder”(我们的新鸟)的内容替换为现有鸟!
//上面的“Bird holder=new Bird()”一行变得毫无意义,因为你从未使用过你的新鸟。
//bx是先前在“主窗口”中创建的鸟。
持有人=bx;
holder.nl=NList;
//现在你把holder添加到列表中,但是holder不再是新的鸟了,而是旧的鸟。
添加鸟名单(持有人);
}
}
您可能想做的是:

private void add2列表\u单击(对象发送者,路由目标)
{
//创建一个新的Bird并将其放入'holder'变量中。
鸟托=新鸟();
//为我们的新鸟创建一个包含两个新巢的新列表。。。
holder.nl=新列表{new Nest(),new Nest()};
//…或将现有嵌套列表与此行一起使用:
//holder.nl=NList;
//将新鸟添加到列表中。
添加鸟名单(持有人);
}
}

我假设该行保持器=bx;这是你的问题。改为添加变量holder。你的意思是我应该取消bx步骤,只使用holder吗?或者删除创建一个新的Bird并使用bx,然后创建一个Bird的新实例并将其分配给bx。此外,不需要嵌套列表的全局值,您在Bird的实例中已经有一个了(因此可以添加到bx.nl),谢谢,成功了。但现在,鸟巢列表不断将所有鸟巢添加到每只鸟身上。我试着为两只鸟分别定义两个巢,但现在两只鸟都有四个巢。感觉这应该是另一个问题。无论如何,我编辑了我的代码,为每只鸟创建了两个新巢。你应该理解的是,如果你对两只鸟使用相同的列表,那么在第一只鸟上添加一个巢也会将它添加到第二只鸟上,因为它们共享该列表!创建一个包含两个鸟巢的列表并为每只新鸟设置此列表,或者为每只新鸟创建一个包含两个鸟巢的新列表。