2016-08-30 15 views
0

スタイルを使用してカスタムコントロールを作成しました。すべて正常に動作していますが、追加しようとしているContextMenuにはアイテムが表示されません。カスタムコントロールContextMenuバインドDependencyPropertyが設定されているときにItemSourceが更新されない

ButtonAnalysisControl(カスタムコントロール)

internal class ButtonAnalysisControl : Control 
{ 
    static ButtonAnalysisControl() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(ButtonAnalysisControl), new FrameworkPropertyMetadata(typeof(ButtonAnalysisControl))); 
    } 

    public string Text 
    { 
     get { return (string)GetValue(TextProperty); } 
     set { SetValue(TextProperty, value); } 
    } 

    public Brush BackgroundBrush 
    { 
     get { return (Brush)GetValue(BackgroundBrushProperty); } 
     set { SetValue(BackgroundBrushProperty, value); } 
    } 

    public ObservableCollection<ViewCommand> ChildCommands 
    { 
     get { return (ObservableCollection<ViewCommand>)GetValue(ChildCommandsProperty); } 
     set { SetValue(ChildCommandsProperty, value); } 
    } 

    public static readonly DependencyProperty TextProperty = 
     DependencyProperty.Register("Text", typeof(string), typeof(ButtonAnalysisControl), new UIPropertyMetadata(string.Empty)); 

    public static readonly DependencyProperty BackgroundBrushProperty = 
     DependencyProperty.Register("BackgroundBrush", typeof(Brush), typeof(ButtonAnalysisControl), new UIPropertyMetadata(Brushes.Transparent)); 

    public static readonly DependencyProperty ChildCommandsProperty = 
     DependencyProperty.Register("ChildCommands", typeof(ObservableCollection<ViewCommand>), typeof(ButtonAnalysisControl), new UIPropertyMetadata(null)); 

} 

Generic.xaml(ButtonAnalysisControlスタイル)

<Style TargetType="anal:ButtonAnalysisControl"> 

    <Style.Triggers> 
     <EventTrigger RoutedEvent="MouseDown"> 
      <EventTrigger.Actions> 
       <BeginStoryboard> 
        <Storyboard> 
         <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="ContextMenu.IsOpen"> 
          <DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="True"/> 
         </BooleanAnimationUsingKeyFrames> 
        </Storyboard> 
       </BeginStoryboard> 
      </EventTrigger.Actions> 
     </EventTrigger> 
    </Style.Triggers> 

    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="anal:ButtonAnalysisControl"> 
       <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="Auto" /> 
         <RowDefinition Height="*"/> 
        </Grid.RowDefinitions> 

        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="*" /> 
        </Grid.ColumnDefinitions> 

        <TextBlock TextAlignment="Center" 
           VerticalAlignment="Stretch" 
           Foreground="{StaticResource CommandBarForeground}" 
           Background="{StaticResource MainForegroundBrush}" 
           FontFamily="{StaticResource FontFamily}" 
           FontSize="10" 
           Grid.Column="0" 
           Grid.Row="0"> 
         <TextBlock.Text> 
          <Binding Path="Text" StringFormat="{}{0}%" RelativeSource="{RelativeSource TemplatedParent}" /> 
         </TextBlock.Text>        
        </TextBlock> 
        <Rectangle Grid.Column="0" 
           Grid.Row="1"> 
         <Rectangle.Fill> 
          <Binding Path="BackgroundBrush" RelativeSource="{RelativeSource TemplatedParent}" /> 
         </Rectangle.Fill> 
        </Rectangle> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 

    <Setter Property="ContextMenu"> 
     <Setter.Value> 
      <ContextMenu> 
       <ContextMenu.ItemsSource> 
        <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="ChildCommands"/> 
       </ContextMenu.ItemsSource> 
       <ContextMenu.ItemContainerStyle> 
        <Style TargetType="{x:Type MenuItem}"> 
         <Setter Property="MenuItem.Header" Value="{Binding Command.Text}"/> 
        </Style> 
       </ContextMenu.ItemContainerStyle> 
      </ContextMenu> 
     </Setter.Value> 
    </Setter> 
</Style> 

ButtonAnalysisControlsは、実行時に作成され、それらは(adornerのコンテンツとして設定されていますこれはadornerのコンストラクタで発生します)。関連コード:

public ButtonAnalysisAdorner(UIElement adornedElement, int numberOfTimesFieldFilled, int numberOfLoggedViews, ObservableCollection<ViewCommand> childCommands) 
     : base(adornedElement) 
    { 
     _visuals = new VisualCollection(this); 
     _contentPresenter = new ContentPresenter(); 
     ButtonAnalysisControl bac = new ButtonAnalysisControl(); 
     bac.Text = percentage.ToString(CultureInfo.InvariantCulture); 
     bac.BackgroundBrush = PercentColorRanges.GetColorFromPercentage((int)percentage, 0.75); 
     bac.ToolTip = ToolTipValue(numberOfTimesFieldFilled, numberOfLoggedViews); 
     bac.ChildCommands = childCommands; 
     Content = bac; 

     _visuals.Add(_contentPresenter); 
    } 

私はButtonAnalysisControlをSnoopで検査しました。 ChildCommandsには必ずしもアイテムがありません。しかし私はそれがChildCommandsを持っていることを知っているButtonAnalysisControlを見ました。私はChildCommandsの依存関係プロパティに2つのアイテムを持つコレクションがあり、ButtonAnalysisControl.ContextMenu.Itemsの値が0であることがわかりました。なぜコンテキストメニューにアイテムがないのかわからないので、コンテキストメニューをChildCommandsにバインドします。これを修正するには?

答えて

-1

私はあなたが望むようにTemplated Parentバインディングが動作しないとは思わない。 ContextMenuの定義は、のテンプレートではではありません。

あなたはこのような何かを試みることができる:

<Style TargetType="anal:ButtonAnalysisControl"> 
    ...  
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="anal:ButtonAnalysisControl"> 
       <Grid Background="Transparent" Tag="{Binding ChildCommands,RelativeSource={RelativeSource TemplatedParent}}"> 
        <Grid.ContextMenu> 
         <ContextMenu ItemsSource="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}"> 
    ... 

ここでノートのカップル:

  • どれポップアップがDataContext継承を壊し、私たちはTagプロパティを通じてつもりだ理由です
  • グリッドの背景は透明なので、クリックを処理します
  • MouseDownトリガーもテンプレート内にあります。
  • 'anal'-namespace ??
+0

ContextMenuスタイルを「