私はWPFを初めて使用するので、私の質問がばかげている場合はお詫び申し上げます。
「フード メニュー」と「オーダー リスト」の 2 つの主要なセクションで構成される食品注文システムを作成しています。ユーザーが食品メニューからアイテムを選択すると、注文リストを表すリストボックス コントロールに追加されます。
「OrderLine」のコレクション クラス と同様に、Order
いくつかのカスタム オブジェクトを作成しました。それらは次のようになります。
OrderLine
Item
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>
そのため、アイテムが追加されると、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
。