ListBox ItemsSource 未更新

ListBox ItemsSource not updating

我正在尝试使用 ItemsSource 将设备列表绑定到 ListBox 并显示设备名称。当您单击不同的类别(头盔、胸部、腿部等)时,ListBox itemsSource 会发生变化。但是当我更改绑定到 itemsSource 的项目的内容时,什么也没有发生。

我曾尝试查看类似的帖子,但其中 none 描述了我的问题。有人说当你覆盖一个对象时它会失去它的绑定但我不知道如何在不覆盖对象的情况下将 ObservableList 的所有内容提供给另一个 ObservableList。

我的视图模型:

        public ObservableCollection<Equipment> SelectedEquipmentCat { get; set; }

        // Gets called in the constructor
        private void InitEquipmentLists()
        {
            helmetEquipment = new ObservableCollection<Equipment>(equipment.Where(equipment => equipment.categorie.Equals("helmet")));
            shouldersEquipment = new ObservableCollection<Equipment>(equipment.Where(equipment => equipment.categorie.Equals("shoulders")));
            chestEquipment = new ObservableCollection<Equipment>(equipment.Where(equipment => equipment.categorie.Equals("chest")));
            beltEquipment = new ObservableCollection<Equipment>(equipment.Where(equipment => equipment.categorie.Equals("belt")));
            legsEquipment = new ObservableCollection<Equipment>(equipment.Where(equipment => equipment.categorie.Equals("legs")));
            bootsEquipment = new ObservableCollection<Equipment>(equipment.Where(equipment => equipment.categorie.Equals("boots")));

        }
        private void helmetCat()
        {
            SelectedEquipmentCat = helmetEquipment;
        }
    }
}

我的看法:

    <Grid>
        <ListBox Margin="10,10,570,10" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
            <ListBoxItem Content="HELMET" FontWeight="Bold" Foreground="Gray" HorizontalContentAlignment="Center" Width="206"/>
            <ListBoxItem Content="{Binding ninja.helmet.naam}" Focusable="False" HorizontalContentAlignment="Center"/>
            <ListBoxItem Content="SHOULDERS" FontWeight="Bold" Foreground="Gray" HorizontalContentAlignment="Center" Width="206"/>
            <ListBoxItem Content="{Binding ninja.shoulders.naam}" Focusable="False" HorizontalContentAlignment="Center"/>
            <ListBoxItem Content="CHEST" FontWeight="Bold" Foreground="Gray" HorizontalContentAlignment="Center" Width="206"/>
            <ListBoxItem Content="{Binding ninja.chest.naam}" Focusable="False" HorizontalContentAlignment="Center"/>
            <ListBoxItem Content="BELT" FontWeight="Bold" Foreground="Gray" HorizontalContentAlignment="Center" Width="206"/>
            <ListBoxItem Content="{Binding ninja.belt.naam}" Focusable="False" HorizontalContentAlignment="Center"/>
            <ListBoxItem Content="LEGS" FontWeight="Bold" Foreground="Gray" HorizontalContentAlignment="Center" Width="206"/>
            <ListBoxItem Content="{Binding ninja.legs.naam}" Focusable="False" HorizontalContentAlignment="Center"/>
            <ListBoxItem Content="BOOTS" FontWeight="Bold" Foreground="Gray" HorizontalContentAlignment="Center" Width="206"/>
            <ListBoxItem Content="{Binding ninja.boots.naam}" Focusable="False" HorizontalContentAlignment="Center"/>
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseDoubleClick">
                    <i:InvokeCommandAction Command="{Binding ShowEquipmentCommand}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </ListBox>
        <ListBox ItemsSource="{Binding SelectedEquipmentCat, Mode=OneWay}" DisplayMemberPath="naam" Margin="233,10,347,10"/>
    </Grid>

我希望当我单击左侧的类别时,第二个 ListBox 会显示正确的设备。

您可以通过实施其中一种解决方案来解决您的问题:

解决方案一:

您可以更改填充 SelectedEquipmentCat 的方法;就像你的情况 helmetCat

    private void helmetCat()
    {
        SelectedEquipmentCat.Clear();
        SelectedEquipmentCat.AddRange(helmetEquipment);
    }

如果您没有 AddRange 实现,那么您可以在源 observableCollection 上使用 foreachSelectedEquipmentCat 中添加项目。

方案二:

SelectedEquipmentCat

的 settter 中引发 OnPropertyChanged 事件(无论您在 INotifyPropertyChanged 界面实现中给出的名称是什么)
private ObservableCollection<Equipment> selectedEquipmentCat 
public ObservableCollection<Equipment> SelectedEquipmentCat 
{ 
   get 
   {
      return selectedEquipmentCat;
   }
   set
   {
       selectedEquipmentCat = value;
       OnPropertyChanged("SelectedEquipmentCat");
   }
 }