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

xml 看起来像:

<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'。可以这样设置吗?

4

1 回答 1

1

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

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

附加属性:

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

使用 Blend 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);
}
于 2017-09-07T14:28:09.080 回答