[英]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.