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