Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何添加变量并将它们从外部文件链接到组合框?_C#_Wpf_Combobox - Fatal编程技术网

C# 如何添加变量并将它们从外部文件链接到组合框?

C# 如何添加变量并将它们从外部文件链接到组合框?,c#,wpf,combobox,C#,Wpf,Combobox,我有一个程序,用户可以根据一个组合框选择一类船只。目前,所有的统计数据和类都硬编码到程序中。问题是我希望能够根据需要添加额外的船型。最好是以一种简单的方式,让我的朋友(他对代码几乎一无所知)和我一起添加飞船(一旦我完成计划,我会给他一份副本供他使用)。每艘船使用一个名字和3个属性。我现有的硬编码代码是- private void cmb_Class_SelectionChanged(object sender, SelectionChangedEventArgs e) {

我有一个程序,用户可以根据一个组合框选择一类船只。目前,所有的统计数据和类都硬编码到程序中。问题是我希望能够根据需要添加额外的船型。最好是以一种简单的方式,让我的朋友(他对代码几乎一无所知)和我一起添加飞船(一旦我完成计划,我会给他一份副本供他使用)。每艘船使用一个名字和3个属性。我现有的硬编码代码是-

private void cmb_Class_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        shipClass = (cmb_Class.SelectedItem as ComboBoxItem).Content.ToString();
        if (shipClass == "Scout")
        {
            attack = 6;
            engine = 10;
            shield = 8;
        }
        if (shipClass == "Warship")
        {
            attack = 10;
            engine = 6;
            shield = 8;
        }
        if (shipClass == "Cargo")
        {
            attack = 8;
            engine = 6;
            shield = 10;
        }
        if (shipClass == "Starliner")
        {
            attack = 6;
            engine = 8;
            shield = 10;
        }
        if (shipClass == "Transport")
        {
            attack = 8;
            engine = 10;
            shield = 6;
        }
        if (shipClass == "Luxury")
        {
            attack = 8;
            engine = 8;
            shield = 8;
        }

        lbl_Attack.Content = attack;
        lbl_Engine.Content = engine;
        lbl_Shield.Content = shield;
    }
组合框cmb_类中的项目都硬编码到WPF表单xml中,标签正是我显示统计数据的方式


奖金问题:我可以为一组类似的“物种”及其统计数据制作一个二级文件(是的,这是科幻RPG类型的东西),但如果有一种简单的方法可以将它们全部制作在同一个文件中,那就太好了。

以下是您可能想要使用的。它不使用XML,而是使用CSV,但您可以轻松地扩展它

首先,您需要一个类来表示您的船舶,如下所示

public class Ship
{
    public string Class { get; set; }
    public int Attack { get; set; }
    public int Engine { get; set; }
    public int Shield { get; set; }
}
interface IShipRepository
{
    List<Ship> GetShips();
}
public partial class MainWindow : Window, INotifyPropertyChanged
{
    private IShipRepository repository = new CSVShipRepository("d:\\test_data.csv");
    private List<Ship> ships;
    private Ship selectedShip;
    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
    }

    public List<Ship> Ships
    {
        get
        {
            if (ships == null)
                ships = repository.GetShips();
            return ships;
        }
    }
    public Ship SelectedShip
    {
        get { return selectedShip; }
        set
        {
            if (selectedShip == value) return;
            selectedShip = value;
            NotifyChanged("SelectedShip");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyChanged(string name)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(name));
    }
}
在此之后,您将需要一种从某种数据源(文件、数据库等)读取船舶的方法。此数据源可能会经常更改,因此您最好将其抽象到下面这样的接口后面

public class Ship
{
    public string Class { get; set; }
    public int Attack { get; set; }
    public int Engine { get; set; }
    public int Shield { get; set; }
}
interface IShipRepository
{
    List<Ship> GetShips();
}
public partial class MainWindow : Window, INotifyPropertyChanged
{
    private IShipRepository repository = new CSVShipRepository("d:\\test_data.csv");
    private List<Ship> ships;
    private Ship selectedShip;
    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
    }

    public List<Ship> Ships
    {
        get
        {
            if (ships == null)
                ships = repository.GetShips();
            return ships;
        }
    }
    public Ship SelectedShip
    {
        get { return selectedShip; }
        set
        {
            if (selectedShip == value) return;
            selectedShip = value;
            NotifyChanged("SelectedShip");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyChanged(string name)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(name));
    }
}

你试过什么?很抱歉,你的问题听起来像“什么是xml以及如何使用它”,这太宽泛了。这里和互联网上都有大量的教程。可以手动写入任何文本文件格式,也可以反序列化设置。看起来您实际上并没有自己做任何努力。问题不在于如何读取xml,而在于如何选择组合框也加载变量。解决问题的一种方法是使用表ship和3个字段(攻击、引擎、屏蔽)创建数据库。在这种情况下,当程序将被加载时,您可以将所有现有的船只加载到类似ObservableCollection的内容,该内容将绑定到combobox。如果您想添加新的船舶,您将需要创建一个按钮(创建船舶)和一个表单,您将能够在其中输入船舶统计信息并保存到数据库。保存后,您可以在ObservaleCollection中重新加载值。使用ships集合作为数据绑定源,而不是将ships集合保留在组合框中,并对对象集合而不是字符串文本进行操作。您的ship类应该包含攻击、引擎和盾牌属性,这样就可以很容易地对这些项进行操作,尤其是保存它们并通过序列化读取文件好的,我对xml不熟悉,所以我不认为有什么方法可以给我举一个例子来说明如何以一种适合我的项目的方式来实现它。这是一个全面的答案!