C# 列表框项目资源未更新

C# 列表框项目资源未更新,c#,wpf,data-binding,listbox,C#,Wpf,Data Binding,Listbox,我正在尝试使用ItemsSource将设备列表绑定到列表框,并显示设备的名称。当您单击不同类别(头盔、胸部、腿部等)时,列表框项资源将发生更改。但是,当我更改绑定到itemsSource的项的内容时,什么也不会发生 我曾尝试在类似的帖子中寻找,但没有一篇描述我的问题。有人说,当你重写一个对象时,它会丢失它的绑定,但我不知道如何在不重写该对象的情况下,将一个ObservableList的所有内容提供给另一个ObservableList 我的ViewModel: public Obs

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

我曾尝试在类似的帖子中寻找,但没有一篇描述我的问题。有人说,当你重写一个对象时,它会丢失它的绑定,但我不知道如何在不重写该对象的情况下,将一个ObservableList的所有内容提供给另一个ObservableList

我的ViewModel:

        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;
        }
    }
}
public observetecollection SelectedEquipmentCat{get;set;}
//在构造函数中调用
专用设备列表()
{
头盔设备=新的可观测集合(设备,其中(设备=>设备分类等于(“头盔”));
shouldersEquipment=新的可观测集合(设备,其中(设备=>设备分类等于(“肩部”));
chestEquipment=新的可观测集合(设备,其中(设备=>设备,分类,等于(“胸部”)));
beltEquipment=新的可观测采集(设备,其中(设备=>设备分类等于(“皮带”));
legsEquipment=新的可观测集合(设备,其中(设备=>设备,分类等于(“腿”)));
bootsEquipment=新的可观测集合(设备,其中设备=>device.categorie.Equals(“boots”));
}
私人空头盔猫()
{
所选设备Cat=头盔设备;
}
}
}
我的看法是:

    <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>


我希望当我单击左侧的类别时,第二个列表框会显示右侧的设备。

您可以通过实施以下解决方案之一来解决问题:

解决方案1:

您可以更改填充所选设备CAT的方法;在您的情况下,如
helmetCat

    private void helmetCat()
    {
        SelectedEquipmentCat.Clear();
        SelectedEquipmentCat.AddRange(helmetEquipment);
    }
如果没有AddRange实现,则可以使用源observableCollection上的
foreach
SelectedEquipmentCat
中添加项

解决方案2:

SelectedEquipmentCat
Setter中引发OnPropertyChanged事件(您在
INotifyPropertyChanged
接口实现中给出的名称)

private ObservableCollection<Equipment> selectedEquipmentCat 
public ObservableCollection<Equipment> SelectedEquipmentCat 
{ 
   get 
   {
      return selectedEquipmentCat;
   }
   set
   {
       selectedEquipmentCat = value;
       OnPropertyChanged("SelectedEquipmentCat");
   }
 }
private ObservableCollection Selected设备猫
公共可观察收集选定的设备Cat
{ 
得到
{
返回所选设备类别;
}
设置
{
选择设备类别=数值;
已更改的属性(“选定设备类别”);
}
}

解决方案2成功了!我没有解决方案1的.AddRange()方法为什么?您可以按照线程中关于AddRange支持的讨论,在
ObservableCollection
中进行。