C# ObservableCollection在选择时获取项目已更改
我有一个WPF组合框:C# ObservableCollection在选择时获取项目已更改,c#,.net,wpf,combobox,observablecollection,C#,.net,Wpf,Combobox,Observablecollection,我有一个WPF组合框: <ComboBox ... ItemsSource="{Binding Source={StaticResource viewModel}, Path=getItems, Mode=OneTime}" x:Name="combobox" SelectionChanged="combobox_SelectionChanged"> ... </ComboBox> 此时将显示组合框,当我选择某个对象时,将获得集合对象的索引。 但是有没有办法把物
<ComboBox ... ItemsSource="{Binding Source={StaticResource viewModel}, Path=getItems, Mode=OneTime}" x:Name="combobox" SelectionChanged="combobox_SelectionChanged">
...
</ComboBox>
此时将显示组合框,当我选择某个对象时,将获得集合对象的索引。
但是有没有办法把物品还给我?例如:
我选择组合框中的第一个元素(索引0),
如何(在combobox\u SelectionChanged listener中)从索引为0的\u objectACollection获取对象?您可以使用combobox.SelectedItem。combobox有SelectedItem属性。我认为您可以将SelectedItem与TwoWay绑定到VM。下面是exmaple。我希望这能有所帮助
<ComboBox ... ItemsSource="{Binding Source={StaticResource viewModel}, Path=getItems, Mode=OneTime}" x:Name="combobox" SelectedItem="{Binding SelectedObjectA, Mode=TwoWay}">
...
</ComboBox>
也许您可以尝试使用一个实现
ICollectionView
接口的集合,我相信其中有一些是现成的。它可以为您跟踪收藏中的选定项目,而无需在viewmodel上使用单独的SelectedObjectA
属性。因此,您可以:
> <ComboBox ... ItemsSource="{Binding Source={StaticResource viewModel},
> Path=**SomeICollectionView**, Mode=OneTime}" x:Name="combobox"> ...
> </ComboBox>
>。。。
>
要从viewmodel类中获取所选项目,您所要做的就是
SomeICollectionView.CurrentItem
好的,谢谢,我忘了在测试中强制转换((ObjectA)combobox.SelectedItem).Name
@David在强制执行之前检查值是否为null,因为我不知道代码的其余部分,但可能在某些情况下未选择任何项,这将引发异常。最好将getItems
重命名为Items
或Collection
。前缀为“get”表示一种方法
<ComboBox ... ItemsSource="{Binding Source={StaticResource viewModel}, Path=getItems, Mode=OneTime}" x:Name="combobox" SelectedItem="{Binding SelectedObjectA, Mode=TwoWay}">
...
</ComboBox>
private ObjectA _SelectedObjectA;
public ObjectA SelectedObjectA
{
get
{
return _SelectedObjectA;
}
set
{
if (_SelectedObjectA == value)
return;
_SelectedObjectA = value;
// Notifu changed here
}
}
> <ComboBox ... ItemsSource="{Binding Source={StaticResource viewModel},
> Path=**SomeICollectionView**, Mode=OneTime}" x:Name="combobox"> ...
> </ComboBox>