Movatterモバイル変換


[0]ホーム

URL:


スマートフォン専用ページを表示

ぬるり。

ぬるりことNullReferenceExceptionに怯えながら日々書き連ねる.NETのコード片(主にC#)
記事検索
 
<<2010年12月>>
   1234
5678 91011
12131415161718
19202122232425
262728293031 
新着記事
(12/09)"ASSOCIATORS OF" on System.Management
(10/03)ScrollIntoView(TextElement)
(09/01)MenuItemとHierarchicalDataTemplate /WPF
(08/31)MenuItemとCompositeCollectionをバインド /WPF
(08/27)MenuItemをバインド /WPF
カテゴリ
日記(5)
C#(26)
VB.NET(7)
.NET(38)
C++/CLI(1)
WPF(5)
過去ログ
2010年12月(1)
2010年10月(1)
2010年09月(1)
2010年08月(2)
2010年05月(1)
2010年03月(1)
2010年01月(1)
2009年12月(1)
2008年07月(1)
2008年04月(2)
2008年03月(3)
2008年02月(1)
2007年10月(1)
2007年08月(1)
2007年03月(3)
2006年12月(1)
2006年10月(1)
2006年06月(1)
2006年05月(1)
2006年04月(6)
最近のコメント
グローバルフック・ザ・キーボード by at (10/18)
グローバルフック・ザ・キーボード by at (10/18)
グローバルフック・ザ・キーボード by 田中 (04/10)
グローバルフック・ザ・キーボード by 田中 (04/10)
他プロセスのメモリへのちょっかい@タブコントロール by (05/28)
最近のトラックバック
C# と NTFS ストリームの甘くなくもない関係 byhttp://www.valras-plage.net/max-test-ultra/(12/03)
動的なDLLインポート by正しい選択(08/10)
COM クライアント実装の道程 for TaskScheduler その番外編2 〜 COM オブジェクトと GC とファイナライザ by黒龍's Blog(06/30)
From Structure To Bytes byPukiWiki/TrackBack 0.1(11/10)
マルチメディアタイマ byAppli Wiki (PukiWiki/TrackBack 0.3)(04/25)
RDF Site Summary
RSS 2.0
<<最大化ボタン最小化ボタン |TOP |MenuItemとCompositeCollectionをバインド /WPF>>

2010年08月27日

MenuItemをバインド /WPF

WPF の MenuItem をバンディングで表現してみようのコーナー。ブラウザのブックマークをサンプルにしてみます。

まずはブックマークを表す VM のクラスを用意。

// Bookmark.cspublicclassBookmark {// INotifyPropertyChanged は略publicstring Title {get;set; }publicstring Url {get;set; }public Bookmark(string title,string url) {this.Title = title;this.Url = url;    }}

これを元に、メニューの XAML を記述します。

<!-- Window1.xaml --><Windowx:Class="Sample.Window1"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">  <DockPanel>    <MenuDockPanel.Dock="Top">      <MenuItemHeader="ブックマーク(_B)"ItemsSource="{Binding}"DisplayMemberPath="Title"/>    </Menu>    <WebBrowserx:Name="browser"/>  </DockPanel></Window>

あとは DataContext に Bookmark のコレクションを設定します。Application の Startup でやるようにしておきます。

// App.xaml.csprivatevoid App_Startup(object sender,StartupEventArgs e) {Window1 window =newWindow1();ObservableCollection<Bookmark> bookmarks =newObservableCollection<Bookmark>();    bookmarks.Add(newBookmark("bing","http://www.bing.com"));    bookmarks.Add(newBookmark("google","http://www.google.co.jp"));    bookmarks.Add(newBookmark("yahoo","http://www.yahoo.co.jp"));    window.DataContext = bookmarks;    window.Show();}

ここまでは簡単だと思います。

さて、これで取り敢えずメニューは表示されるようになりますが、当然項目をクリックしても何の反応もありません。メニュー項目をクリックしたときにその URL に移動する動作が必要です。

入力への応答の記述方法はいくつかありますが、今回は CommandBinding を使用します。

<!-- Window1.xaml --><!-- ブックマークのメニューの部分だけ書き換え --><MenuItemHeader="ブックマーク(_B)"ItemsSource="{Binding}"DisplayMemberPath="Title">  <MenuItem.CommandBindings>    <CommandBindingCommand="Favorites"Exected="Navigate"/>  </MenuItem.CommandBindings>  <MenuItem.ItemContainerStyle>    <StyleTargetType="{x:Type MenuItem}">      <SetterProperty="Command"Value="Favorites"/>      <SetterProperty="CommandParameter"Value="{Binding}"/>    </Style>  </MenuItem.ItemContainerStyle></MenuItem>

NavigationCommands.Favorites は基本ライブラリが定義している RoutedCommand であり、Routed の名前通り、コマンドが呼び出されると要素ツリー内の CommandBinding を検索してくれます。つまり、親の MenuItem の CommandBindings に Favorites を設定しておけば子 MenuItem の全ての Command を拾ってくれるって事です。ショートカットキー「Ctrl + I」が定義されているのが難点ですが、ここではおいておきます。

ItemContainerStyle は、ItemsSource を元に作られる各子 MenuItem 自体の Style です。

Favorites コマンドで実行されるメソッド(Navigate)内でどのアイテムがクリックされたか判定するために、CommandParameter を使います。子 MenuItem の DataContext は Bookmark オブジェクトになるため、この DataContext そのものである Bookmark オブジェクトがパラメータになります。

あとは CommandBinding.Executed イベントで呼び出される Navigate メソッドです。

// Window1.xaml.csprivatevoid Navigate(object sender,ExectedRoutedEventArgs e) {Bookmark bm = e.ParameterasBookmark;if (bm !=null) {this.browser.Navigate(newUri(bm.Url));    }}

次のステップはCompositeCollection を使う場合 および階層メニューを表示する場合

posted by Hongliang at 00:49|Comment(0)|TrackBack(0)|WPF|このブログの読者になる|更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック

ここ(hongliang.seesaa.net)で公開しているものについて、利用は自由に行って頂いて構いません。改変、再頒布もお好きになさって下さい。利用に対しこちらが何かを要求することはありません。

ただし、公開するものを使用、または参考したことによって何らかの損害等が生じた場合でも、私はいかなる責任も負いません。

あ、こんなのに使ったってコメントを頂ければ嬉しいです。

Powered by Seesaa
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。


[8]ページ先頭

©2009-2025 Movatter.jp