【发布时间】:2021-07-16 22:59:06
【问题描述】:
我有两个ListBoxes。一个ListBox 显示一些项目。每个项目都有一个子项目列表。第二个ListBox 显示第一个ListBox 中当前项的子项。典型的项目/子项目场景。当我向子项列表添加一个值时,我无法让第二个 ListBox 更新。如何强制第二个ListBox 更新我的子项?
我的简化 XAML 和视图模型如下。请注意,我的视图模型继承自 Prism 的BindableBase。在我的视图模型中,我有一种方法可以将值添加到子项列表并使用RaisePropertyChanged 更新Items 属性。
<ListBox Name="Items" ItemsSource="{Binding Items}" >
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<Label Content="{Binding ItemValue, Mode=TwoWay}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<ListBox Name="SubItems" ItemsSource="{Binding Items.CurrentItem.SubItems}" >
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<Label Content="{Binding}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
class Item
{
public int ItemValue { get; set; }
public List<int> SubItems { get; set; }
}
class MyViewModel : BindableBase
{
private ObservableCollection<Item> _items = new ObservableCollection<Item>();
public MyViewModel()
{
List<Item> myItems = new List<Item>() { /* a bunch of items */ };
_items = new ObservableCollection<Item>(myItems);
Items = new ListCollectionView(_items);
}
public ICollectionView Items { get; private set; }
private void AddNewSubItem(object obj)
{
Item currentItem = Items.CurrentItem as Item;
currentItem.SubItems.Add(123);
RaisePropertyChanged("Items");
}
}
【问题讨论】:
-
<ListBox Name="SubItems" ItemsSource="{Binding SelectedItem.SubItems, ElementName=Items}" > -
这不起作用。将值添加到 SubItems 就好了,只是不更新 ListBox。我试过 Items.InvalidateVisual 和 Items.UpdateLayout - 也没有用。
-
Item.SubItems 是 ObservableCollection 吗?
标签: c# wpf xaml listbox subitem