无法在放置在另一个Observable Collection中的对象中迭代Observable Collection对象

时间:2014-07-03 05:36:36

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

(对不起,如果标题很麻烦,我觉得很难让它获得权利。)

我在一个对象中迭代(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'的引用。

在错误1上,我尝试同时使用forforeach,但它也一样。

错误2

  

运营商'&lt;'不能应用于'int'和'method group'类型的操作数

错误3

  

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

错误4

  

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

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

有什么想法吗?感谢。

1 个答案:

答案 0 :(得分:2)

您需要做的就是将这些错误复制并粘贴到任何搜索引擎中,以便快速轻松地找到答案。但是,当你把它们粘贴在这里时,我会为你做你的工作:

  

无法将带有[]的索引应用于类型为'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超出相关集合的范围,这仍然会爆发。下一个:

  

运营商'&lt;'不能应用于'int'和'method group'类型的操作数

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

  

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的引用添加到您的项目中。