C# WPF列表框绑定更新

C# WPF列表框绑定更新,c#,wpf,xaml,binding,listbox,C#,Wpf,Xaml,Binding,Listbox,我是WPF的新手,我刚刚设法将特定类项的列表绑定到一个列表框。列表框现在成功地显示它们。下面是一些代码,首先是类: public class OrderItem { public int Quantity { get; set; } public string Name { get; set; } public Double Price { get; set; } } 一些虚拟数据和绑定,这些都发生在主程序的构造函数中: List<OrderItem> cu

我是WPF的新手,我刚刚设法将特定类项的列表绑定到一个列表框。列表框现在成功地显示它们。下面是一些代码,首先是类:

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;
List currentOrderItems=new List();
currentOrderItems.Add(newOrderItem(){Quantity=5,Name=“Test”,Price=5});
currentOrderItems.Add(newOrderItem(){Quantity=15,Name=“Test”,Price=6.66});
currentOrderItems.Add(newOrderItem(){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 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>

我的问题是如何更新列表框以显示我正在添加到包含OrderItems数据的列表中的新项目。如果我以任何方式添加、删除或修改列表,这不会反映在列表框中。
谢谢

不要使用
列表
使用
可观察收集
。这将通知您添加/删除了某些内容,以便您的列表框知道如何刷新


此外,您的
OrderItem
需要实现
INotifyPropertyChanged
,您的设置者需要调用
OnPropertyChanged

,为您的案例提供使用mvvm模式的最佳方式。 简言之: 您的模型OrderItem应该实现接口INotifyPropertyChanged。 如果属性发生更改,它会通知您。 然后创建viewmodel并在datacontext中进行设置。在带有OrderItems的viewModel addObservableCollection中,此集合应通知视图其中的更改。
有关更多信息,请阅读以下文章:

您还可以在代码隐藏中重新绑定列表框:

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);
}
List currentOrderItems=new List();
currentOrderItems.Add(newOrderItem(){Quantity=5,Name=“Test”,Price=5});
currentOrderItems.Add(newOrderItem(){Quantity=15,Name=“Test”,Price=6.66});
currentOrderItems.Add(newOrderItem(){Quantity=1,Name=“Test 3”,Price=15.88});
在代码隐藏中:

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);
}
私有ObservableCollection\u OrderItemCollection;
公共ObservableCollection OrderItemCollection
{
得到
{
如果(_OrderItemCollection==null)
_OrderItemCollection=新的ObservableCollection();
return\u OrderItemCollection;
}
set=>\u OrderItemCollection=value;
}
private CollectionViewSource _OrderItemCollectionViewSource;
公共ICollectionView OrderItemCollectionViewSource=>\u OrderItemCollectionViewSource.View;
公共void loadData()
{
_OrderItemCollectionViewSource=新的CollectionViewSource();
_OrderItemCollectionViewSource.Source=新的ObservableCollection(currentOrderItems);
绑定b=新绑定(“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>
<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>


谢谢你们两位的帮助!另外,在绑定一些动态人员时,不要忘记将绑定的NotifyOnSourceUpdated和NotifyOnTargetUpdated属性设置为
true