我有一个mnuMainMenu
由几个子菜单组成的主菜单。其中一个子菜单mnuMostRecentDirs
本身就是另一个菜单,它使用绑定到 ObservableCollection 的 ItemSource 属性在运行时生成项目。基本上它显示最近使用的文件夹列表。
问题是添加的 MenuItems 动态生成以下数据绑定错误:
主菜单的 XAML 声明如下所示:
<!-- 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>
以下代码在运行时将文件夹添加到可观察集合中:
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);
}
}
我能够将问题追溯到以 MenuItem 样式声明的绑定,该绑定未在我的应用程序中声明。我认为这是菜单项的默认样式..
其他菜单项似乎都没有任何绑定问题,并且相同样式应用于所有菜单项。
所以我认为问题一定是我动态添加 MenuItems 的方法。更具体地说,似乎在将项目添加到 ItemsControl 之前将样式应用于 MenuItem。
到目前为止,在将 MenuItem 添加到可观察集合之前,我只能在代码中设置 HorizontalContentAlignment 属性,但这只是一个创可贴,它只是真正掩盖了真正的问题。