2017-09-07 130 views
1

我试图实现双击行为。该代码的.cs看起来像:双击行为

public class DoubleTappedBehavior : Behavior<InputElement> 
{ 
    /// <summary> 
    ///  The command. 
    /// </summary> 
    public static readonly DirectProperty<DoubleTappedBehavior, ICommand> CommandProperty = 
     AvaloniaProperty.RegisterDirect<DoubleTappedBehavior, ICommand>(
      nameof(Command), 
      o => o.Command, 
      (o, v) => o.Command = v); 

    public ICommand Command 
    { 
     get { return GetValue(CommandProperty); } 
     set { SetValue(CommandProperty, value); } 
    } 

    protected override void OnAttached() 
    { 
     base.OnAttached(); 
     AssociatedObject.DoubleTapped += DoubleTapped; 
    } 

    protected override void OnDetaching() 
    { 
     AssociatedObject.DoubleTapped -= DoubleTapped; 
     base.OnDetaching(); 
    } 

    private void DoubleTapped(object sender, RoutedEventArgs e) 
    { 
     if (Command == null) 
      return; 

     Command.Execute(null); 
    } 
} 

的XAML看起来像:

<TreeView Items="{Binding Sections, ElementName=ToC, Mode=TwoWay}" 
      SelectedItem="{Binding SelectedSection, ElementName=ToC, Mode=TwoWay}"> 

    <TreeView.Styles> 
    <Style Selector="TreeViewItem"> 
     <Setter Property="commandBehaviors:DoubleTappedBehavior.Command" 
       Value="{Binding IncrementCount}"/> 
     <!--<Setter Property="commandBehaviors:DoubleTappedBehavior.CommandParameter" 
       Value="{Binding}"/>--> 
    </Style> 
    </TreeView.Styles> 
</TreeView> 

我得到异常:找不到AvaloniaProperty 'DoubleTappedBehavior.Command'。可以这样设置吗?

回答

1

无法确定您正在使用的确切软件包,但看起来您正在创建类似Blend的行为,而该样式尝试设置附加属性。

如果是这种情况,那么您需要更改行为类以使用附加属性或在样式中设置Interaction.Behaviors属性。

附加属性:

https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/attached-properties-overview

使用混合SDK行为:

<TreeView Items="{Binding Sections, ElementName=ToC, Mode=TwoWay}" 
     SelectedItem="{Binding SelectedSection, ElementName=ToC, Mode=TwoWay}"> 
    <i:Interaction.Behaviors> 
     <commandBehaviors:DoubleTappedBehavior Command="{Binding IncrementCount}" CommandParameter="{Binding}" /> 
    </i:Interaction.Behaviors> 
</TreeView> 

附加属性的行为:

public class DoubleTappedBehavior 
{ 
    public static readonly DependencyProperty CommandProperty = DependencyProperty.RegisterAttached("Command", typeof(ICommand), typeof(DoubleTappedBehavior), new PropertyMetadata(null, OnCommandChanged)); 
    public static readonly DependencyProperty CommandParameterProperty = DependencyProperty.RegisterAttached("CommandParameter", typeof(object), typeof(DoubleTappedBehavior), new PropertyMetadata(null)); 

    private static void OnCommandChanged(DependencyObject target, DependencyPropertyChangedEventArgs args) 
    { 
     var element = target as UIElement; 

     if (element != null) 
     { 
      element.DoubleTapped -= OnDoubleTapped; 
      element.DoubleTapped += OnDoubleTapped; 
     } 
    } 

    private static void OnDoubleTapped(object sender, DoubleTappedRoutedEventArgs e) 
    { 
     var element = sender as UIElement; 

     if (element != null) 
     { 
      var command = GetCommand(element); 
      var commandParameter = GetCommandParameter(element); 

      if (command != null) 
      { 
       if (command.CanExecute(commandParameter)) 
       { 
        command.Execute(commandParameter);  
       } 
      } 
     } 
    } 

    public static void SetCommand(UIElement target, ICommand value) => target.SetValue(CommandProperty, value); 

    public static ICommand GetCommand(UIElement target) => (ICommand)target.GetValue(CommandProperty); 

    public static void SetCommandParameter(UIElement target, object value) => target.SetValue(CommandProperty, value); 

    public static object GetCommandParameter(UIElement target) => target.GetValue(CommandParameterProperty); 
} 
+0

我试了一下还带有附加属性。我没有得到例外,但它仍然无法正常工作。 '''c public static readonly AttachedProperty CommandProperty = AvaloniaProperty.RegisterAttached (“Command”); public static ICommand GetCommand(TreeViewItem element) return element.GetValue(CommandProperty);公共静态无效SetCommand(TreeViewItem元素,ICommand值) element.SetValue(CommandProperty,value);公共静态void SetCommand(TreeViewItem元素,ICommand值) {0} } ''' – Kevin

+0

在你附加的行为类中,你的附属属性上是否有更改过的处理程序? – Eric

+0

阿瓦洛尼亚没有改变的处理程序。 set和get属性不会被调用。 – Kevin