2011-08-03 9 views
1

リストボックスの項目にコンテキストメニューを追加したいとします。通常、答えはコンテキストメニューをアイテムテンプレートのルートに追加することです。しかし、私はテンプレートセレクターを使用しているので、リストボックスの各項目のデータに応じて、使用中の複数のテンプレートがあります。つまり、各テンプレートに同じコンテキストメニュー定義を追加する必要があります。これはあまり魅力的ではありません。WP7のコンテキストメニューを共有するxaml

解決策の1つは、ContentFormrolでデータテンプレートをラップして、コンテキストメニュー定義の場所を1つにすることです。しかし、これは必要ではないレイアウトオーバーヘッドを追加すると考えています。

私が試した別の解決策は、リソース辞書にContextMenuを追加することですが、これはすべての用途にわたって同じオブジェクトインスタンスを共有することになり、ContextMenuの実装方法のためにこれも機能しません。

第3の解決策は、Loadedイベントを使用して、コンテキストメニューを適切に取り込む関数を呼び出すことです。しかし、これはXAMLにあるはずのコードをコードに移動させてしまい、かなり醜いものに見えます。 xamlでコンテキストメニューを定義し、それをコードから参照する方法があれば、それは魅力的だと思いますが、どうやってそれを行うのかは分かりません。

テンプレートセレクタのテンプレート全体で同じContextMenuを共有する正しい方法は何ですか?


これで動作しますが、各項目に2つのコンテンツコントロールを追加終わるContentControlに方法、:

  <ListBox.ItemTemplate> 
       <DataTemplate> 
        <ContentControl> 
         <toolkit:ContextMenuService.ContextMenu> 
          <toolkit:ContextMenu Loaded="ContextMenu_Loaded"> 
           <toolkit:MenuItem Header="Delete"/> 
          </toolkit:ContextMenu> 
         </toolkit:ContextMenuService.ContextMenu> 
         <ContentControl ContentTemplate="{StaticResource MyTemplate}" Content="{Binding}"/> 
        </ContentControl> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 

答えて

1

どうTemplateSelectorへのContextMenuを追加する方法について?

<ListBox ItemsSource="{Binding}"> 
    <ListBox.Resources> 
     <DataTemplate x:Key="MyTemplate"> 
      <StackPanel> 
       <TextBlock Text="{Binding}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.Resources> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <local:CustomTemplateSelector Content="{Binding}"> 
       <toolkit:ContextMenuService.ContextMenu> 
        <toolkit:ContextMenu> 
         <toolkit:MenuItem Header="Delete" 
              Click="MenuItem_Click" /> 
        </toolkit:ContextMenu> 
       </toolkit:ContextMenuService.ContextMenu> 
       <local:CustomTemplateSelector.TemplateOne> 
        <DataTemplate> 
         <ContentControl Content="{Binding}" 
             ContentTemplate="{StaticResource MyTemplate}" 
             Foreground="Blue" /> 
        </DataTemplate> 
       </local:CustomTemplateSelector.TemplateOne> 
       <local:CustomTemplateSelector.TemplateTwo> 
        <DataTemplate> 
         <ContentControl Content="{Binding}" 
             ContentTemplate="{StaticResource MyTemplate}" 
             Foreground="Red" /> 
        </DataTemplate> 
       </local:CustomTemplateSelector.TemplateTwo> 
       <local:CustomTemplateSelector.TemplateThree> 
        <DataTemplate> 
         <ContentControl Content="{Binding}" 
             ContentTemplate="{StaticResource MyTemplate}" 
             Foreground="Yellow" /> 
        </DataTemplate> 
       </local:CustomTemplateSelector.TemplateThree> 
      </local:CustomTemplateSelector> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

私はこれを実行し、私のために働いています - これはあなたが探していた効果かどうか試してみてください。

+0

正確に私が必要としたもの。ご協力いただきありがとうございます。 –

関連する問題