2017-04-27 78 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; 
} 

但不都。

相关问题