【问题标题】:Can't Iterate an Observable Collection object in an Object Which Placed In another Observable Collection无法在放置在另一个可观察集合中的对象中迭代可观察集合对象
【发布时间】:2014-07-03 05:36:35
【问题描述】:

(对不起,如果标题这么麻烦,我觉得很困惑。)

我在一个对象中迭代(forforeachObservableCollection 对象时遇到问题,该对象放置在另一个 ObservableCollection 中。

这是我的“对象”类(在可移植类库中)

public class NotationGroup : INotifyPropertyChanged
{
    ...
    private ObservableCollection<Notation> _notations;
    ...
    public ObservableCollection<Notation> Notations
    {
        get { return _notations; }
        set { _notations = value; NotifyPropertyChanged("Notations"); }
    }

    ...
}

这就是我访问它的方式

public class MainWindowModelView : INotifyPropertyChanged
{
    ...
    private ObservableCollection<NotationGroup> _notationGroups;
    ....
    public ObservableCollection<NotationGroup> NotationGroups 
    { get { return _notationGroups; } set { _notationGroups = value; NotifyPropertyChanged("NotationGroups"); } }

    ...

    public void AddOrUpdateNote(Notes note, ModifierKeys mKeys)
    {
        if (mKeys == ModifierKeys.Control)
        {
            foreach (NotationGroup item in NotationGroups)
            {
                for (int i = 0; i < item.Notations.Count; i++) //ERROR 1
                {
                    if (item.Notations[i].IsSelected) //ERROR 2
                    {
                        item.Notations[i].Note = note; //ERROR 3
                    }   
                }
            }
        }
        else
        {
            if (NotationGroups.Count(x => x.IsSelected) > 1)
            {
                var selectedNG = NotationGroups.FirstOrDefault(x => x.IsSelected);

                ClearSelected();

                (selectedNG as NotationGroup).Notations[0].IsSelected = true; //ERROR 4
            }

            ...
        }
    }
}

(为了清晰而修剪了一些代码)

这些是错误信息:

错误 1

类型“System.Collections.ObjectModel.ObservableCollection`1”在未引用的程序集中定义。您必须添加对程序集 'System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes' 的引用。

在 ERROR 1 上,我尝试同时使用 forforeach,但结果相同。

错误 2

运算符“

错误 3

无法将带有 [] 的索引应用于“System.Collections.ObjectModel.ObservableCollection`1”类型的表达式

错误 4

无法将带有 [] 的索引应用于“System.Collections.ObjectModel.ObservableCollection`1”类型的表达式

我也添加了System.Windows,但没有帮助。

有什么想法吗?谢谢。

【问题讨论】:

  • 两个类是否在同一个程序集中?您的目标是哪个 .NET 框架? (如果 .NET framework
  • NotationGroup 在类库中。而且它们都是.NET Framework 4.5

标签: c# wpf mvvm observablecollection portable-class-library


【解决方案1】:

您只需将这些错误复制并粘贴到任何搜索引擎中,即可快速轻松地找到答案。但是,看到您将它们粘贴到此处,我会为您完成您的工作:

无法将带有 [] 的索引应用于“System.Collections.ObjectModel.ObservableCollection`1”类型的表达式

真的 正是它所说的......你不能在ObservableCollection 上使用索引。那么,你是在哪里做的呢?错误甚至告诉你在哪里:

item.Notations[i].Note = note;

(selectedNG as NotationGroup).Notations[0].IsSelected = true;

解决方案?如果您在网上搜索过,您会发现我们使用ElementAt 方法来访问使用LinQ 的元素:

item.Notations.ElementAt(i).Note = note;

(selectedNG as NotationGroup).Notations.ElementAt(0).IsSelected = true;

当然,如果i 超出相关集合的范围,这仍然会爆炸。下一个:

运算符“

你说这发生在这一行,但我看不出是怎么回事……这似乎更像是最后一个错误:

if (item.Notations[i].IsSelected)

您可能只需要在线搜索那个。最后,我们有一个简单的参考问题:

类型“System.Collections.ObjectModel.ObservableCollection`1”在未引用的程序集中定义。您必须添加对程序集 'System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes' 的引用。

再次,一个非常明显和明确的错误... ObservableCollection 是在未引用的程序集中定义的。您必须添加对程序集 System.Windows 的引用。修复?照它说的做...将System.Windows dll 的引用添加到您的项目中。

【讨论】:

  • 我的 OP 上已经说明了最后一个。 “我也添加了 System.Windows,但没有帮助。”
  • 这个错误很明显。这就是该错误的解决方案。
  • 哦,看来我只是添加了using System.Windows 而不引用程序集。谢谢。
猜你喜欢
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多