2017-04-03 5 views
0

下の画像からわかるように、2つのホバー状態がわかります。ここにはXAMLがありますMenuCollection 2回のバインドMVVM +データバインディングの子メニュー項目

<Menu ItemsSource="{Binding Data.MenuCollection}"> 
    <Menu.ItemTemplate > 
     <DataTemplate DataType="MenuItem"> 
      <MenuItem Header="{Binding Header}" Command="{Binding Command}" ItemsSource="{Binding Children}"/> 
     </DataTemplate> 
    </Menu.ItemTemplate> 
</Menu> 

データのコレクションはヘッダーで機能します。しかし、私は子ノードを表示することはできません。

public void CreateTempMenuList() 
{ 
    MenuCollection = new ObservableCollection<MenuItem>() 
    { 
     new MenuItem() 
     { 
      Header = "File", 
      Children = new ObservableCollection<MenuItem>() 
      { 
       new MenuItem() 
       { 
        Header = "Exit" 
       } 
      } 
     } 
    }; 
} 

MenuItemクラスは私が作成したものです。各プロパティには、OnPropertiesChanged関数を呼び出すセッターがあります。私は必要に応じてクラスを追加することができますが、私はかなり問題ではないと確信しています。

私の質問はそうです。どうすれば'double' hoverを取り除くことができますか?画像では2 bordersを見ることができます。私が上に乗るouter border。ホバーは何かに集中するまで残っています。

私の2番目の質問は、どのように子アイテムを動作させることができますか? menuitemタグのitemssourceは間違っている可能性がありますが、そのすべては私が考えることができます。

enter image description here

答えて

1

HierarchicalDataTemplateを定義します。あなたは、テンプレート内の別のMenuItemの要素を追加してはいけませんので

<Menu ItemsSource="{Binding Data.MenuCollection}"> 
    <Menu.Resources> 
     <Style TargetType="MenuItem"> 
      <Setter Property="Command" Value="{Binding Command}" /> 
     </Style> 
    </Menu.Resources> 
    <Menu.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
      <TextBlock Text="{Binding Header}" /> 
     </HierarchicalDataTemplate> 
    </Menu.ItemTemplate> 
</Menu> 

System.Windows.Controls.MenuItemコンテナは、暗黙のうち、各項目ごとに作成されます。

が組み込まれたMenuItem要素には適用されないため、ObservableCollection<System.Windows.Controls.MenuItem>にバインドしないようにしてください。

+0

ありがとうございました。そして、私はシステムMenuItemクラスにバインドしていません、私はそれのために自分のクラスを構築しました。ありがとうございます:) –

0

現在のコードを動作させるには、Menu control > Edit Additional Template > Edit ItemContainerStyle > Edit Copyを右クリックします。

そして、生成されたスタイルで

、コードのこの作品のために

検索:

  <Trigger Property="Role" Value="TopLevelItem"> 
       <Setter Property="Padding" Value="7,2,8,3"/> 
       <Setter Property="Template" Value="{DynamicResource {ComponentResourceKey ResourceId=TopLevelItemTemplateKey, TypeInTargetAssembly={x:Type MenuItem}}}"/> 
      </Trigger> 

そして0代わりの7,2,8,3からPaddingを変更します。

+0

このイモは 'ハッキー'と思われます。私は答えに感謝します。 –

+0

@ A.Millsシーンの裏側で起こっていることも知っておく必要があります。 – AnjumSKhan

関連する問題