簡體   English   中英

WPF 列表框綁定更新

[英]WPF ListBox Binding Update

我是 WPF 的新手,我只是設法將特定類項的列表綁定到 ListBox。 ListBox 現在成功顯示它們。 這是一些代碼,首先是類:

public class OrderItem
{
    public int Quantity { get; set; }
    public string Name { get; set; }
    public Double Price { get; set; }
}

一些虛擬數據和綁定,所有這些都發生在主程序的構造函數中:

List<OrderItem> currentOrderItems = new List<OrderItem>();
        currentOrderItems.Add(new OrderItem() { Quantity = 5, Name = "Test", Price = 5 });
        currentOrderItems.Add(new OrderItem() { Quantity = 15, Name = "Test test", Price = 6.66 });
        currentOrderItems.Add(new OrderItem() { Quantity = 1, Name = "Test 3", Price = 15.88 });
        listOrderItems.ItemsSource = currentOrderItems;

和 XAML:

<ListBox HorizontalAlignment="Left" Margin="150,27,0,23" Name="listOrderItems" Width="150" FontFamily="Times New Roman" FontSize="12">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid Margin="4">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="{Binding Quantity}" FontWeight="Bold"  />
                    <TextBlock Grid.Column="1" Text="{Binding Name }" />
                    <TextBlock Grid.Column="2" Text="{Binding Price }" />
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

我的問題是如何更新 ListBox 以顯示我添加到包含數據的列表中的新項目,即 OrderItems。 如果我以任何方式添加、刪除或修改 List,這不會反映在 ListBox 中。 謝謝!

對於您的情況,最好使用 mvvm 模式。 簡而言之:您的模型 OrderItem 應該實現接口INotifyPropertyChanged 如果屬性發生變化,它會通知這一點。 然后創建視圖模型並將其設置在數據上下文中。 在 viewModel 中添加ObservableCollection和 OrderItems,這個集合應該通知視圖它的變化。 有關更多信息,請閱讀以下文章: MVVM

而不是使用List<OrderItem>使用ObservableCollection<OrderItem> 這將通知添加/刪除了某些內容,以便您的 ListBox 知道要刷新。

此外,您的OrderItem需要實現INotifyPropertyChanged並且您的設置者需要調用OnPropertyChanged

您還可以在后面的代碼中重新綁定您的 ListBox:

List<OrderItem> currentOrderItems = new List<OrderItem>();
currentOrderItems.Add(new OrderItem() { Quantity = 5, Name = "Test", Price = 5 });
currentOrderItems.Add(new OrderItem() { Quantity = 15, Name = "Test test", Price = 6.66 });
currentOrderItems.Add(new OrderItem() { Quantity = 1, Name = "Test 3", Price = 15.88 });

在后面的代碼中:

private ObservableCollection<OrderItem> _OrderItemCollection;
public ObservableCollection<OrderItem> OrderItemCollection
{
    get
    {
        if (_OrderItemCollection == null)
            _OrderItemCollection = new ObservableCollection<OrderItem>();
        return _OrderItemCollection;
    }
    set => _OrderItemCollection = value;
}

private CollectionViewSource _OrderItemCollectionViewSource;
public ICollectionView OrderItemCollectionViewSource => _OrderItemCollectionViewSource.View;


public void loadData()
{
    _OrderItemCollectionViewSource = new CollectionViewSource();
    _OrderItemCollectionViewSource.Source = new ObservableCollection<OrderItem>(currentOrderItems) ;
    Binding b = new Binding("OrderItemCollectionViewSource") { Source = this };
    listOrderItems.SetBinding(ListBox.ItemsSourceProperty, b);
}

和 XAML:

<ListBox HorizontalAlignment="Left" Margin="150,27,0,23" Name="listOrderItems" Width="150" FontFamily="Times New Roman" FontSize="12">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid Margin="4">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>
                <TextBlock Text="{Binding Quantity}" FontWeight="Bold"  />
                <TextBlock Grid.Column="1" Text="{Binding Name }" />
                <TextBlock Grid.Column="2" Text="{Binding Price }" />
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM