1

我是 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对象。

4

2 回答 2

4

1 - 不要创建自己的集合类型,.Net 框架基类库已经拥有几乎所有你需要的东西。

删除OrderLineCollection并使用ObservableCollection<OrderLine>.

2 - 尝试遵守 MVVM 约定。这意味着您不应在代码中操作 UI 元素。

public OrderList()
{
    InitializeComponent();
    LoadCurrentOrder();
    DataContext = this;
}

然后在 XAML 中:

<ListBox ItemsSource="{Binding LineItems}" HorizontalContentAlignment="Stretch">

3 - 不要在 XAML 中命名 UI 元素,除非您需要在 XAML 中引用它们。每当您发现自己想要在过程代码中操作 UI 元素时,这将帮助您重新考虑您的方法。

4 - 习惯 C# 命名约定。属性名称应该是“正确大小写”(IELineItems而不是lineItems

于 2013-03-05T16:23:29.357 回答
0

您所要做的就是将lineItems属性变为ObservableCollection<yourType>. 然后,当这个集合发生变化(添加、删除项目)时,列表框将自动刷新。

如果您的问题是订单本身发生了变化,您需要刷新列表框。然后您需要做的就是实现INotifyPropertyChanged,当订单发生变化时,触发属性已更改的通知,UI 将通过绑定刷新。

至于以更优雅的方式绑定。您可以绑定到currentOrder.lineItems

lbxOrder.ItemsSource = currentOrder.lineItems;//this should be an observable collection if you intend to have items change
于 2013-03-05T16:17:39.103 回答