Я новичок в WPF, поэтому примите мои извинения, если мой вопрос глуп.
Я создаю систему заказа еды, которая состоит из 2 основных разделов: «Меню еды» и «Список заказов». Когда пользователь выбирает элемент из меню еды, он будет добавлен в элемент управления списка, который представляет список заказов.
Я создал несколько пользовательских объектов: Order
, OrderLine
, Item
, а также класс Collection OrderLineCollection
для "OrderLine". Они выглядят следующим образом:
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>
поэтому при добавлении элементов ListBox будет выглядеть так, как показано ниже: 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
.