2017-04-27 53 views
2

我在從UserControl派生的WPF中有一個控件。該控件具有名爲IsDraggable的依賴項屬性。它的實現是這樣的: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; 

在XAML中,有一個文本菜單的用戶控件:

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

使用該用戶控件,我加入了一個到主窗口和一個外部用戶控件內。在外部控制中,可檢查MenuItem的工作方式與預期的類似,但在內部控制中,檢查IsDraggable是否爲假,並在其爲真時取消選中。

這是什麼原因造成的?

+0

也許只是從MenuItem中刪除Click處理程序。將IsCheckable設置爲true並且綁定IsChecked應該足夠了。 – Clemens

回答

0

爲什麼在事件處理程序中顯式設置IsDraggable屬性?您應該在MenuItemIsChecked屬性綁定到你的UserControl屬性:

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

或者處理CheckedUnchecked eventw的MenuItem的:

<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; 
} 

但不都。

相關問題