2017-04-27 1 views
2

私はWPFでUserControlから派生したコントロールを持っています。コントロールにはIsDraggableという名前の依存関係プロパティがあります。それは、次のように実装されます:XAMLでWPFカスタムDependencyPropertyへのバインド - IsCheckedはプロパティの値と反対の場合があります

public static readonly DependencyProperty IsDraggableProperty = 
    DependencyProperty.Register(nameof(IsDraggable), typeof(bool), typeof(MyUserControl)); 
public bool IsDraggable 
{ 
    get { return (bool)this.GetValue(IsDraggableProperty); } 
    set { this.SetValue(IsDraggableProperty, value); } 
} 

private void IsDraggableMenuItemClick(object sender, RoutedEventArgs e) 
    => this.IsDraggable = !this.IsDraggable; 

、のContextMenuは、ユーザーコントロールのためにそこにある:

<UserControl.ContextMenu> 
    <ContextMenu> 
     <!-- other menu items here --> 
     <MenuItem 
      Header="Draggable" 
      IsCheckable="True" 
      Click="IsDraggableMenuItemClick" 
      IsChecked="{Binding Path=MyUserControlsNameProperty, ElementName=IsDraggable}" /> 
    </ContextMenu> 
</UserControl.ContextMenu> 

このユーザーコントロールを使用して、私は外側のユーザーコントロール内のメインウィンドウに1、および1つ追加されました。外側のコントロールでは、チェック可能なMenuItemは期待どおりに機能しますが、内側のコントロールではIsDraggableがfalseのときにチェックされ、trueのときはチェックされません。

この原因は何ですか?

+0

おそらく、MenuItemからClickハンドラを削除するだけです。 IsCheckableをtrueに設定し、IsCheckedをバインドするだけで十分です。 – Clemens

答えて

0

IsDraggableプロパティをイベントハンドラで明示的に設定するのはなぜですか?あなたのUserControlプロパティにMenuItemIsCheckedプロパティをバインドする必要があり、次のいずれか

<UserControl.ContextMenu> 
    <ContextMenu> 
     <!-- other menu items here --> 
     <MenuItem 
      Header="Draggable" 
      IsCheckable="True" 
      IsChecked="{Binding Path=PlacementTarget.IsDraggable, RelativeSource={RelativeSource AncestorType=ContextMenu}}" /> 
    </ContextMenu> 
</UserControl.ContextMenu> 

それともMenuItemCheckedUnchecked eventwを扱う:

<MenuItem 
    Header="Draggable" 
    IsCheckable="True" 
    Checked="MenuItem_Checked" Unchecked="MenuItem_Unchecked" /> 

private void MenuItem_Unchecked(object sender, RoutedEventArgs e) 
{ 
    this.IsDraggable = false; 
} 

private void MenuItem_Checked(object sender, RoutedEventArgs e) 
{ 
    this.IsDraggable = true; 
} 

でもありませんどちらも。

関連する問題