我试图实现双击行为。 .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'。可以这样设置吗?
答案 0 :(得分: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);
}