Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.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# Listview-Listview中所选项目的价格计算_C#_Listview_Observablecollection_Windows 10 Universal - Fatal编程技术网

C# Listview-Listview中所选项目的价格计算

C# Listview-Listview中所选项目的价格计算,c#,listview,observablecollection,windows-10-universal,C#,Listview,Observablecollection,Windows 10 Universal,我有一个菜单,显示此类中可观察集合中的项目: class DeHavMenu { private string foodName; private double price; public string FoodName { get {return foodName; } set { foodName = value; } } public double Price { get {r

我有一个菜单,显示此类中可观察集合中的项目:

 class DeHavMenu
{
    private string foodName;
    private double price;

    public string FoodName
    {
        get {return foodName; }

        set {  foodName = value; }
    }

    public double Price
    {
        get {return price;}

        set {  price = value; }
    }

    public DeHavMenu(string f, double p)
    {
        this.foodName = f;
        this.price = p;
    }

   public override string ToString()
    {
        return (this.FoodName + " Price: £" + this.Price);
    }

}
现在在菜单页面上,我添加页面上的项目以在列表视图中显示:

public sealed partial class DeHavillandMenu : Page
{
    private ObservableCollection<DeHavMenu> menuItems = new ObservableCollection<DeHavMenu>();
    public DeHavillandMenu()
    { this.InitializeComponent();
        MenuList.SelectionMode = ListViewSelectionMode.Multiple;
        this.menuItems = new ObservableCollection<DeHavMenu>();
        this.menuItems.Add(new DeHavMenu("Sausage/Bacon roll and hot drink", 2.25));
        this.menuItems.Add(new DeHavMenu("5 item cooked breakfast and hot drink", 2.75));
        this.menuItems.Add(new DeHavMenu("Pizza with selection of pasta, wedges and garlic bread", 4.25));
        this.menuItems.Add(new DeHavMenu("Baked / grilled Halal chicken with piri piri", 6.50));
        this.menuItems.Add(new DeHavMenu("Baked / grilled Halal chicken with tandoori", 6.50)); 
        MenuList.DataContext = menuItems;
     }
}
公共密封部分类DeHavilland菜单:第页
{
private ObservableCollection menuItems=新的ObservableCollection();
公共数据目录()
{this.InitializeComponent();
MenuList.SelectionMode=ListViewSelectionMode.Multiple;
this.menuItems=新的ObservableCollection();
添加(新的DeHavMenu(“香肠/培根卷和热饮”,2.25));
添加(新的DeHavMenu(“5种煮熟的早餐和热饮”,2.75));
这个.menuItems.Add(新的DeHavMenu(“选择意大利面、楔块和大蒜面包的比萨饼”,4.25));
此.menuItems.Add(新DeHavMenu(“烤/烤清真鸡肉配皮里皮里酱”,6.50));
添加(新DeHavMenu(“烤/烤清真鸡配tandoori”,6.50));
MenuList.DataContext=menuItems;
}
}
菜单页面显示项目罚款,可以选择多个项目罚款,但无法找到解决方案,以计算总价格的总和选择的项目。 我知道使用
Menulist.selecteditems.price
是合适的,但它没有给我选择的权利


提前感谢。

您可以扩展
ObservableCollection
来创建
菜单
类型。这样,无论何时,只要您想要得到总数,就可以使用自动进行计算的属性。您还需要更新
DeHavMenu
以拥有
IsSelected
属性(该属性将在XAML中绑定或以编程方式设置)

double sum = 0;
foreach(ListViewItem Item in MenuList.SelectedItems)
{
    sum += double.Parse(Item.SubItems[1].Text);
}
菜单

public class Menu : ObservableCollection<DeHavMenu>
{
    public double TotalPrice 
    {
        get 
        { 
            var totalPrice = 0.0;
            foreach (var menuItem in this)
            {
                if (menuItem.IsSelected)
                {
                    totalPrice += menuItem.Price;
                }
            }
            return totalPrice;
        }
    }
}
public class DeHavMenu
{
    private string foodName;
    private double price;
    private bool isSelected;

    public bool IsSelected
    {
        get { return isSelected; }
        set
        {
            isSelected = value;
            RaisePropetyyChanged(); // If XAML data-binding
        }
    }

    public string FoodName
    {
        get {return foodName; }

        set {  foodName = value; }
    }

    public double Price
    {
        get {return price;}

        set {  price = value; }
    }

    public DeHavMenu(string f, double p)
    {
        this.foodName = f;
        this.price = p;
    }

    public override string ToString()
    {
        return (this.FoodName + " Price: £" + this.Price);
    }
}
this.menuItems = new Menu();
然后,将菜单项更新为

public class Menu : ObservableCollection<DeHavMenu>
{
    public double TotalPrice 
    {
        get 
        { 
            var totalPrice = 0.0;
            foreach (var menuItem in this)
            {
                if (menuItem.IsSelected)
                {
                    totalPrice += menuItem.Price;
                }
            }
            return totalPrice;
        }
    }
}
public class DeHavMenu
{
    private string foodName;
    private double price;
    private bool isSelected;

    public bool IsSelected
    {
        get { return isSelected; }
        set
        {
            isSelected = value;
            RaisePropetyyChanged(); // If XAML data-binding
        }
    }

    public string FoodName
    {
        get {return foodName; }

        set {  foodName = value; }
    }

    public double Price
    {
        get {return price;}

        set {  price = value; }
    }

    public DeHavMenu(string f, double p)
    {
        this.foodName = f;
        this.price = p;
    }

    public override string ToString()
    {
        return (this.FoodName + " Price: £" + this.Price);
    }
}
this.menuItems = new Menu();
现在,您可以通过执行以下操作获得总数:

var menu = this.menuItems as Menu;
if (menu != null)
{
    var total = menu.TotalPrice;
}
如果您没有使用数据绑定,并且正在设置stuff代码,那么可以在获得TotalPrice之前添加以下代码

foreach (var item in Menu)
{
    item.IsSelected = false; // reset to default
}

foreach(var selectedItem in Menulist.selecteditems)
{
    var deHavMenu = selectedItem as DeHavMenu;
    if (devHavMenu != null)
    {
        devHavMenu.IsSelected = true; 
    }
}
您提到的“Menulist.selecteditems”是一个可枚举的(某物的集合)。这意味着它没有一个特定的“价格”属性。相反,您需要将MenuList.SelectedItems中的每个价格相加。您可以使用LINQ快速完成这项工作,方法如下:

MenuList.SelectedItems.Sum(x => x.Price)

也许你应该有一个只读属性,你用一个前缀来和Menulist.selecteditems.price相加,然后返回总值。关闭主题:考虑使用A来存储货币/货币值。会这样做的,谢谢你的建议听起来像个新手,但是在菜单上:观察收集器,这是来自一个新的类吗?是的,你只是继承了它。Menu将是一个新的派生类。我创建了一个新的Menu类,它派生自Observablecollection,但是我得到了一条不一致的可访问性消息,表明类Menu不太容易访问可观察的集合。请确保所有类都是公共的。Menu和DeHavMenuOkay,所以我省略了“将isselected属性重置为默认值”,只是想尝试一下,假设它已经在defaulty上了,再次尝试菜单,价格确实合算!非常感谢您的帮助,非常感谢:)在尝试该代码时,子项似乎没有显示。我还缺什么吗?我以前从未用过LINQ,我会试试这个。谢谢