mnuMainMenu
いくつかのサブメニューで構成されるメイン メニューがあります。サブメニューの 1 つはmnuMostRecentDirs
、ObservableCollection にバインドされた ItemSource プロパティを使用して、実行時にアイテムが生成される別のメニューです。基本的に、最近使用したフォルダーのリストを表示しています。
問題は、動的に追加された MenuItem が次のデータ バインディング エラーを生成することです。
メイン メニューの 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 に適用されているようです。
これまでのところ、監視可能なコレクションに追加する前に、コードで HorizontalContentAlignment プロパティを MenuItem に設定することしかできませんでしたが、それは単なる応急処置であり、実際の問題を実際に隠しているだけです。