【问题标题】:ObservableCollection get item on SelectionChangedObservableCollection 在 SelectionChanged 上获取项目
【发布时间】:2012-04-26 06:37:23
【问题描述】:

我有一个 WPF 组合框:

<ComboBox ... ItemsSource="{Binding Source={StaticResource viewModel}, Path=getItems, Mode=OneTime}" x:Name="combobox" SelectionChanged="combobox_SelectionChanged">
    ...
</ComboBox>

有很多项目。

还有我的 ViewModel 类:

public class ViewModel
{
    private readonly ObservableCollection<ObjectA> _objectACollection= new ObservableCollection<ObjectA>(); 

    public ViewModel()
    { 
        _objectACollection.Add(new ObjectA("Text 1", "Text", "Text"));
        _objectACollection.Add(new ObjectA("Text 2", "Text", "Text"));
        _objectACollection.Add(new ObjectA("Text 3", "Text", "Text"));
    }

    public void combobox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        Trace.WriteLine(combobox.SelectedIndex);
    }

    public ObservableCollection<ObjectA> getItems
    {
        get { return _objectACollection; }
    }
}

以及 selectionChanged 监听器:

private void combobox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    Trace.WriteLine(combobox.SelectedIndex);
}

显示组合框,当我选择某些内容时,我会获得集合对象的索引。 但是有什么方法可以将对象归还给我吗?例如: 我选择 ComboBox 中的第一个元素(索引 0), 如何从索引为 0 的 _objectACollection 中获取(在 combobox_SelectionChanged 侦听器中)对象?

【问题讨论】:

  • 最好将getItems 重命名为ItemsCollection。带有“get”前缀的建议方法

标签: c# .net wpf combobox observablecollection


【解决方案1】:

ComboBox 有 SelectedItem 属性。我认为您可以将 SelectedItem 与 TwoWay 与您的 VM 绑定。以下是示例。我希望这会有所帮助。

<ComboBox ... ItemsSource="{Binding Source={StaticResource viewModel}, Path=getItems, Mode=OneTime}" x:Name="combobox"  SelectedItem="{Binding SelectedObjectA, Mode=TwoWay}">
...
</ComboBox>

您应该在 VM 中添加 SelectedObjectA 属性。您可以从 VM.SelectedObjectA 属性中获取所选项目。

    private ObjectA _SelectedObjectA;
    public ObjectA SelectedObjectA
    {
        get
        {
            return _SelectedObjectA;
        }
        set
        {
            if (_SelectedObjectA == value)
                return;

            _SelectedObjectA = value;

            // Notifu changed here
        }
    }

【讨论】:

    【解决方案2】:

    你可以使用combobox.SelectedItem。

    【讨论】:

    • 好的,谢谢,我忘了在我的测试中投...((ObjectA)combobox.SelectedItem).Name
    • @David 在转换之前检查值是否为空,因为我不知道您的其余代码,但可能会出现未选择任何项目的情况,这会引发异常。
    【解决方案3】:

    也许您可以尝试使用实现ICollectionView 接口的集合,我相信其中有一些。它会为您跟踪集合中选定的项目,而无需单独的SelectedObjectA 属性你的视图模型。所以你可以:

    > <ComboBox ... ItemsSource="{Binding Source={StaticResource viewModel},
    > Path=**SomeICollectionView**, Mode=OneTime}" x:Name="combobox"> ...
    > </ComboBox>
    

    要从 viewmodel 类中获取所选项目,您只需 SomeICollectionView.CurrentItem

    【讨论】:

      猜你喜欢
      • 2019-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-17
      • 1970-01-01
      相关资源
      最近更新 更多