我是 WPF 的新手,所以如果我的问题很愚蠢,请接受我的道歉。
我正在创建一个食品订购系统,它由两个主要部分组成,“食品菜单”和“订单列表”。当用户从食物菜单中选择一个项目时,它将被添加到代表订单列表的列表框控件中。
我已经为“OrderLine”创建了一些自定义对象: Order
, OrderLine
,Item
以及 Collection 类 , 。OrderLineCollection
它们如下所示:
public class Order
{
public string ID { get; set; }
public DateTime DateTime { get; set; }
public double TotalAmt { get; set; }
public OrderLineCollection LineItems { get; set; }
}
public class OrderLine
{
public Item Item { get; set; }
public double UnitPrice { get; set; }
public int Quantity { get; set; }
public double SubTotal { get { return unitPrice * quantity; } }
}
[Serializable]
public class OrderLineCollection : CollectionBase
{
public OrderLine this[int index]
{
get { return (OrderLine)List[index]; }
set { List[index] = value; }
}
}
public class Item
{
public string ID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public double UnitPrice { get; set; }
public byte[] Image { get; set; }
}
我的ListBox
控件有一个DataTemplate
,以便为每个项目显示更多详细信息。XAML 如下:
<Page x:Class="FoodOrdering.OrderList"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Order List">
<ListBox Name="lbxOrder" HorizontalContentAlignment="Stretch">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Margin="5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="80"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="40"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Grid.RowSpan="2" Text="{Binding item.name}"/>
<TextBlock Grid.Row="0" Grid.Column="1" Text="x "/>
<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding quantity}" Margin="10,0,0,0"/>
<TextBlock Grid.Row="0" Grid.Column="2" Text="{Binding subTotal, Converter={StaticResource priceConverter}}" HorizontalAlignment="Right"/>
<Button Grid.Row="1" Grid.Column="2" Margin="0,5,0,0" Click="btnDelete_Click">Delete</Button>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Page>
因此,当添加项目时,列表框将如下图所示: https ://dl.dropbox.com/u/6322828/orderList.png
在代码隐藏中,我创建了一个currentOrder
用于存储当前订单的静态变量,它将被其他类/方法使用。
并且每次更改其值时,LoadCurrentOrder()
都会调用以下愚蠢的方法来刷新 ListBox 视图。
public partial class OrderList : Page
{
public static Order currentOrder = new Order();
public OrderList()
{
InitializeComponent();
LoadCurrentOrder();
}
public void LoadCurrentOrder()
{
lbxOrder.Items.Clear();
foreach (OrderLine ol in currentOrder.LineItems)
lbxOrder.Items.Add(ol);
}
}
我的问题是如何以优雅的方式(例如使用Resources
ItemsSource
等)绑定数据而不是使用上述方法,以便每次更改变量的值时ListBox都会自动更新?
我试过
lbxOrder.ItemsSource = currentOrder;
但它不起作用,因为 currentOrder 不是System.Collections.IEnumerable
对象。