前々回の続き。今回のテーマは、階層メニューです。前回でなく前々回なのは、今回は前回扱った動静混在メニューは置いておくからです。題材は引き続きブラウザのブックマーク。
この記事では、実際に URL を持っていてクリックすればそのページに飛べるのをブックマーク、複数のブックマークを子要素に持てるのをフォルダと呼ぶことにします。フォルダは子要素にブックマークの他にさらにフォルダを持つことも可能とします。
まずこういうもののクラス構造を考えましょう。フォルダの下にフォルダとブックマークが混在可能なのですから、一つのコレクションで扱うために共通の基底クラスが欲しいところです。表示名 Title は共通要素ですね。ブックマークは子要素を持たない代わりに URL を保持します。となるとまずこんな感じでしょう。
// Bookmark.cspublicabstractclassBookmarkBase {vwpublicstring Title {get;set; }}publicclassBookmark :BookmarkBase {publicstring Url {get;set; }public Bookmark() { }public Bookmark(string title,string url) {this.Title = title;this.Url = url; }}publicclassBookmarkFolder :BookmarkBase {publicICollection<BookmarkBase> Items {get;privateset; }public BookmarkFolder() {this.Items =newObservableCollection<BookmarkBase>(); }public BookmarkFolder(string title,paramsBookmarkBase[] items) {this.Title = title;this.Items =newObservableCollection<BookmarkBase>(items); }}
このクラスを使って、Windows1 の DataContext に設定します。
// App.xaml.csprivatevoid App_Startup(object sender,StartupEventArgs e) {Window1 window =newWindow1();ObservableCollection<BookmarkBase> bookmarks =newObservableCollection<BookmarkBase>(); bookmarks.Add(newBookmarkFolder("検索エンジン",newBookmark("bing","http://www.bing.com"),newBookmarkFolder("google",newBookmark("google.co.jp","http://www.google.co.jp"),newBookmark("google.com","http://www.google.com")),newBookmarkFolder("yahoo",newBookmark("yahoo","http://www.yahoo.co.jp")))); bookmarks.Add(newBookmark("msdn","http://msdn.microsoft.com")); window.DataContext = bookmarks; window.Show();}
あとは XAML です。基本的に前々回の XAML と同じですが、ツリー状のデータをバインディングで展開するために、DisplayMemberPath だけで済ませる訳にはいきません。ItemTemplate で HierarchicalDataTemplate を使って繰り返しを表現します。
<!-- Window1.xaml --><!-- MenuItem の書き換え部分だけ抜粋 --><MenuItemHeader="ブックマーク(_B)"ItemsSource="{Binding}"> <MenuItem.ItemTemplate> <HierarchicalDataTemplateItemsSource="{Binding Items}"> <TextBlockText="{Binding Title}"/> </HierarchicalDataTemplate> </MenuItem.ItemTemplate><!-- 以下は元のまま -->
まあ DisplayMemberPath の代わりに ItemTemplate 書いただけで終わりなんですが。割と見たままなんで解説もいいですよね。
ここ(hongliang.seesaa.net)で公開しているものについて、利用は自由に行って頂いて構いません。改変、再頒布もお好きになさって下さい。利用に対しこちらが何かを要求することはありません。
ただし、公開するものを使用、または参考したことによって何らかの損害等が生じた場合でも、私はいかなる責任も負いません。
あ、こんなのに使ったってコメントを頂ければ嬉しいです。
この広告は90日以上新しい記事の投稿がないブログに表示されております。