MenuItem agregado causa programáticamente un error de enlace
Tengo un menu principalmnuMainMenu
que consta de varios submenús. Uno de los submenús.mnuMostRecentDirs
es otro menú que tiene sus elementos generados en tiempo de ejecución, utilizando la propiedad ItemSource vinculada a un ObservableCollection. Básicamente, se muestra una lista de las carpetas utilizadas más recientemente.
El problema es que los elementos de menú agregados generan dinámicamente el siguiente error de enlace de datos:
La declaración XAML del menú principal es algo así:
<!-- Main Menu -->
<Menu x:Name="mnuMainMenu" Height="Auto" IsMainMenu="True">
<!--- ... more menu declarations before ... -->
<MenuItem x:Name="mnuitemWorkDirs" Header="Directories">
<MenuItem x:Name="mnuNewDir"
Header="New"
Style="{StaticResource MenuItem}"
Command="{x:Static cmds:Commands.NewDirectory}" />
<MenuItem x:Name="mnuCurrentDir"
Header="Current"
Style="{StaticResource MenuItem}"
Command="{x:Static cmds:Commands.CurrentDirectory}" />
<MenuItem x:Name="mnuMostRecentDirs"
Header="Recent Directories.."
Style="{StaticResource MenuItem}"
ItemsSource="{Binding ElementName=theMain, Path=MostRecentFoldersList}" />
</MenuItem>
<!--- ... more menu declarations after ... -->
</Menu>
Y el siguiente código agrega carpetas a la colección observable en tiempo de ejecución:
private void PopulateMostRecentFoldersList(string[] paths)
{
MostRecentFoldersList.Clear();
if (paths == null)
return;
foreach (var fullPath in paths)
{
var mi = new MenuItem();
mi.Command = Commands.ChooseWorkingDirectory;
mi.CommandParameter = fullPath;
string name = System.IO.Path.GetFileName(fullPath);
mi.Header = name.ToUpper();
// removing this style completely
// or manually setting the HorizontalContentAlignment property here
// prevents the binding error from happening
mi.Style = (Style)FindResource("MenuItem");
MostRecentFoldersList.Add(mi);
}
}
Pude rastrear el problema hasta un enlace declarado en el estilo para MenuItem que no se declaró en mi aplicación. Supongo que es el estilo predeterminado para los elementos del menú ...
Ninguno de los otros elementos del menú parece tener problemas de enlace con el mismo estilo que se aplica a todos.
Así que estoy pensando que el problema debe ser mi enfoque para agregar dinámicamente los elementos de menú. Más específicamente, parece que el estilo se aplica a MenuItem antes de que el elemento se agregue a ItemsControl.
Hasta ahora, solo pude configurar la propiedad HorizontalContentAlignment en el código, en el elemento MenuItem antes de agregarla a la colección observable, pero eso es solo una curita y es solo una máscara del verdadero problema.