C# &引用;集合已修改错误“0”;,但仅在按键时,而不使用相同的方法调用单击按钮

C# &引用;集合已修改错误“0”;,但仅在按键时,而不使用相同的方法调用单击按钮,c#,C#,这里似乎经常出现“Collection was modified;enumeration operation may not execute”(集合已修改;枚举操作可能无法执行)错误,但它们似乎都无法解决我遇到的问题。我遇到的奇怪问题是,只有当我按下绑定到命令的键时,异常才会出现,而不是当我单击绑定到同一命令的按钮时 XAML: 下面是ItemStuff类背后的代码: bool canExecute; ICommand updateItemsA, updateItemsB; List<

这里似乎经常出现“Collection was modified;enumeration operation may not execute”(集合已修改;枚举操作可能无法执行)错误,但它们似乎都无法解决我遇到的问题。我遇到的奇怪问题是,只有当我按下绑定到命令的键时,异常才会出现,而不是当我单击绑定到同一命令的按钮时

XAML:


下面是ItemStuff类背后的代码:

bool canExecute;
ICommand updateItemsA, updateItemsB;
List<string> _itemsList;
List<string> ItemsA;
List<string> ItemsB;

public ItemStuff() 
{
    canExecute = true;
    ItemsA = new List<string> { "item A", "item B", "item C" };
    ItemsB = new List<string> { "item D", "item E", "item F" };
    ItemsList = ItemsA;
}

public ICommand UpdateItemsA
{
    get
    {
        return updateItemsA
                ?? (updateItemsA = new CommandHandler(() => UpdateMainItemsA(), canExecute));
    }
}

public ICommand UpdateItemsB
{
    get
    {
        return updateItemsB
                ?? (updateItemsB = new CommandHandler(() => UpdateMainItemsB(), canExecute));
    }
}

void UpdateMainItemsA()
{
    ItemsList = ItemsA;
}

void UpdateMainItemsB()
{
    ItemsList = ItemsB;
}

public List<string> ItemsList
{
    get
    {
        return _itemsList;
    }
    set
    {
        _itemsList = value;
        OnPropertyChanged("ItemsList");
    }
}

public event PropertyChangedEventHandler PropertyChanged;

private void OnPropertyChanged(string propertyName)
{
    PropertyChangedEventHandler handler = PropertyChanged;

    if (handler != null)
    {
        handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

public class CommandHandler : ICommand
{
    private Action _action;
    private bool _canExecute;

    public CommandHandler(Action action, bool canExecute)
    {
        _action = action;
        _canExecute = canExecute;
    }

    public bool CanExecute(object parameter)
    {
        return _canExecute;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        _action();
    }
}
bool-canExecute;
ICommand updateItemsA、updateItemsB;
列表项目列表;
列出项目a;
列出项目b;
公共物品
{
canExecute=true;
ItemsA=新列表{“项目A”、“项目B”、“项目C”};
ItemsB=新列表{“项目D”、“项目E”、“项目F”};
ItemsList=ItemsA;
}
公共ICommand UpdateItemsA
{
得到
{
返回updateItemsA
??(updateItemsA=newcommandHandler(()=>UpdateMainItemsA(),canExecute));
}
}
公共ICommand UpdateItemsB
{
得到
{
返回更新temsb
??(updateItemsB=新命令处理程序(()=>UpdateMainItemsB(),canExecute));
}
}
void UpdateMainItemsA()
{
ItemsList=ItemsA;
}
void UpdateMainItemsB()
{
ItemsList=ItemsB;
}
公共列表项目列表
{
得到
{
返回项目列表;
}
设置
{
_itemsList=值;
OnPropertyChanged(“项目列表”);
}
}
公共事件属性更改事件处理程序属性更改;
私有void OnPropertyChanged(字符串propertyName)
{
PropertyChangedEventHandler处理程序=PropertyChanged;
if(处理程序!=null)
{
处理程序(这是新的PropertyChangedEventArgs(propertyName));
}
}
公共类CommandHandler:ICommand
{
私人行动;
私人楼宇可执行;
公共命令处理程序(操作,布尔canExecute)
{
_行动=行动;
_canExecute=canExecute;
}
公共布尔CanExecute(对象参数)
{
返回-可执行;
}
公共事件处理程序CanExecuteChanged;
public void Execute(对象参数)
{
_动作();
}
}
我在XAML中确定了以下三个区域,如果删除它们,则不会发生异常

<ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid Columns="3" />
            </ItemsPanelTemplate>
</ListBox.ItemsPanel> 

<ListBox IsSynchronizedWithCurrentItem="True" />

<Setter Property="FocusManager.FocusedElement" Value="{Binding RelativeSource={RelativeSource Self}}" />


因此,我认为问题可能与listbox具有键盘焦点,然后按键切换项目有关,因为正如我在单击按钮切换项目时提到的,没有问题。键盘焦点是应用程序的一项要求,用户应该能够在不使用鼠标的情况下导航。

您的代码中有一部分我们在这里看不到,您正在使用“ImageDatabase[CurrentSelection].ImagePath”进行一些工作,而代码在foreach循环中。。您可以在foreach行中使用.ToList(),也可以将ImagePath复制到临时变量,并使用该临时变量启动foreach循环。。但是这些都不是您应该做的正确操作,请在程序处于foreach循环时查找您在哪里修改此列表

此结构是什么
ImageDatabase[CurrentSelection]。ImagePath
ps代码似乎没有问题,但是,在您的情况下,这可能是我们看不到的代码造成的。请检查任何迭代
MainImages
的代码。也许其中一个正在修改它?@通用图像数据库是我创建的对象列表。单个对象表示具有多个属性的相册,其中一个属性是ImagePath,它是图像所在的字符串列表。CurrentSelection表示当前查看的相册。用户可以选择在整个列表中更改为不同的相册。对不起,如果我没有提供足够的代码。我试图将其简化,以使其更容易求解。@mjwills我想这就是我所做的,显示按钮和键都指向完全相同的命令。当我按下按钮时,它工作,但键不工作。很奇怪。我将尝试进一步扩展代码。@mjwills我已更新了我的原始帖子和代码,以更好地显示问题。现在,有人可以将此代码粘贴到新的解决方案中,直接查看问题。谢谢你的建议。我会调查的,但我很确定它没有被修改。否则,当我单击使用完全相同命令的按钮时,它如何工作正常?按钮和键实际上指向完全相同的代码。我不确定,因为我看不到您的所有代码,但可能是因为:当您使用按钮时,您的代码可能不在foreach循环中,但当您使用键时,您的代码可能仍在循环中进行一些工作。我已使用全新的代码更新了我的原始帖子,以显示问题。这段代码是整个程序,我已经将其简化为重现问题所需的部分。
<ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid Columns="3" />
            </ItemsPanelTemplate>
</ListBox.ItemsPanel> 

<ListBox IsSynchronizedWithCurrentItem="True" />

<Setter Property="FocusManager.FocusedElement" Value="{Binding RelativeSource={RelativeSource Self}}" />