Я должен был предоставить имена для существующих предметов, для которых я намеревался динамически создавать подпункты. Кроме того, я столкнулся с проблемой, когда я подключался к событию Window_Loaded, и он выпрыгивал из события после запуска этого:
row.MoveFocus(new TraversalRequest(FocusNavigationDirection.First));
Я должен был убедиться, что загрузил пункты меню перед запуском строки выше.
Причина, по которой этот вопрос, вероятно, является распространенным, заключается в том, что intellisense делает вывод, что коллекция Items доступна только для чтения. Этот ответ является частично дополнительным, потому что приведенные выше ответы, похоже, указывают на то, что если у вас есть уже существующие элементы, вы должны либо удалить их в коде, либо их вообще нет. Это не правда Я смог заставить это работать с уже существующими элементами и добавлять дополнительные элементы динамического меню в коде:
<DataGrid AutoGenerateColumns="False" HorizontalAlignment="Stretch" Margin="12,29,12,12" Name="grid" VerticalAlignment="Stretch" Background="#FF3A81A0" AlternatingRowBackground="#FFD9EEF2" FontSize="15" RowHeaderWidth="0" KeyDown="grid_KeyDown">
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem Header="_Encrypt Row Values" Click="MenuItem_ContextMenu_Click_EncryptRowValues" Name="MenuItem_EncryptRowValues" />
<MenuItem Header="De_crypt Row Values" Click="MenuItem_ContextMenu_Click_DecryptRowValues" Name="MenuItem_DecryptRowValues" />
<MenuItem Header="Copy Row_s" Click="MenuItem_ContextMenu_Click_CopyRows" />
</ContextMenu>
</DataGrid.ContextMenu>
<DataGrid.Resources>
//Add Encryption Menu Items
for (int i=0; i< encryptionKeys.Count; i++)
{
MenuItem keyOption = new MenuItem();
keyOption.Header = "_" + i.ToString() + " " + encryptionKeys[i];
MenuItem_EncryptRowValues.Items.Add(keyOption);
}
//Add Decryption Menu Items
for (int i = 0; i < encryptionKeys.Count; i++)
{
MenuItem keyOption = new MenuItem();
keyOption.Header = "_" + i.ToString() + " " + encryptionKeys[i];
MenuItem_DecryptRowValues.Items.Add(keyOption);
}