静的メニュー項目と動的メニュー項目の両方が必要なシナリオがあります。静的アイテムは、XAMLで定義され、動的アイテムはビューモデルによって提供されます。それぞれの動的項目はVieModelで表され、CommandViewModelと呼ぶことができます。 CommandViewModelには表示名があり、他のCommandViewModelも含めることができます。動的XAMLメニュー項目と静的XAMLメニュー項目の混在
次のようにメニュー用のDataContextがあるとして使用されますMainViewModel:
public class MainMenuViewModel : INotifyPropertyChanged
{
private ObservableCollection<CommandViewModel> m_CommandVMList;
public MainMenuViewModel()
{
m_ CommandVMList = new ObservableCollection<CommandViewModel>();
CommandViewModel cmv = new CommandViewModel();
cmv.DisplayName = "Dynamic Menu 1";
m_CommandVMList.Add(cmv);
cmv = new CommandViewModel();
cmv.DisplayName = "Dynamic Menu 2";
m_CommandVMList.Add(cmv);
cmv = new CommandViewModel();
cmv.DisplayName = "Dynamic Menu 3";
m_CommandVMList.Add(cmv);
}
public ObservableCollection<CommandViewModel> CommandList
{
get { return m_CommandVMList; }
set
{
m_CommandVMList = value;
OnPropertyChanged("CommandList");
}
}
... ... ...
メニューXAML:
<Grid>
<Grid.Resources>
<HierarchicalDataTemplate DataType="{x:Type Fwf:CommandViewModel}" ItemsSource="{Binding Path=CommandViewModels}">
<MenuItem Header="{Binding Path=DisplayName}"/>
</HierarchicalDataTemplate>
</Grid.Resources>
<Menu VerticalAlignment="Top" HorizontalAlignment="Stretch">
<MenuItem Header="Static Top Menu Item 1">
<MenuItem Header="Static Menu Item 1"/>
<MenuItem Header="Static Menu Item 2"/>
<MenuItem Header="Static Menu Item 3"/>
<ItemsControl ItemsSource="{Binding Path= CommandList}"/>
<MenuItem Header="Static Menu Item 4"/>
</MenuItem>
</Menu>
</Grid>
除くすべて正常に動作します動的なメニューのリストを表現しようとすると、この場合ItemsControlはUIに1つのMenu Iteとして表示されていますより多くのメニュー項目をまとめているので、項目をクリックするとダイナミックメニュー項目のコレクション全体が選択されます。コレクションは、各動的メニュー項目がメニュー項目自体として表示され、この大きなメニュー項目内に表示されるという点で、正しく表されます。私は、メニューが、静的または動的な、それが気にしない各項目のメニュー項目を作成するだけなのはなぜかと思う。各ダイナミックメニュー項目を同じレベルで作成し、親メニュー項目に属するようにする方法はありますか?
うん理由は主にXAMLはかなりあるということで、私はそれを行うことがしたいが、残念ながら、私はできません私の手からアプリケーション開発者が作成/管理しています。私のモデルを使用して、メニューからコードを引き出す必要があるものをメニューに追加するだけです。 –
それは残念です。 CompositeCollection(http://msdn.microsoft.com/en-us/library/system.windows.data.compositecollection.aspx)を利用するためにXAMLを変更する方法はありますか? これは理想的ではありませんが、動的なアイテムを注入することができます。私が見ることができる唯一の欠点は、結果として得られるMenuItemがどのようにソートされるかです。しかし、前に来たMenuItemsを1つのコレクションとして扱い、後で別のものとして扱うMenuItemsを扱うことができます。 – micahtan
Micahtan - 多分あなたのポストまでCompositeCollectionクラスを使って解決策を書くべきでしょうか?それは本当に正しい方法だと思われるからです。ありがとう、私は同じ問題を抱えてきた。 – arconaut