【问题标题】:uwp define eventriggerbehavior inside styleuwp 定义 eventtriggerbehavior 内部样式
【发布时间】:2016-08-20 07:21:22
【问题描述】:

我目前遇到一个问题。我想为我的所有列表视图声明一个 eventtriggerbehavior。这是我的代码:

<Style TargetType="ListView">
            <Setter Property="ItemTemplate" Value="{StaticResource itemShowTemplate}" />
            <i:Interaction.Behaviors>
                <Interactions:EventTriggerBehavior EventName="ItemClicked">
                    <Interactions:InvokeCommandAction Command="{Binding ShowItemClickedCommand}" />
                </Interactions:EventTriggerBehavior>
            </i:Interaction.Behaviors>
</Style>

我现在遇到的问题是 EventTriggerBehavior 正在查找样式上的事件,而不是 Listview 的目标类型。 EventTriggerBehavior 上剩下的唯一属性是 SourceObject。但我不想在 1 个列表视图上出现这种行为,我希望在我的所有列表视图上都出现这种行为。

有没有办法做到这一点?

【问题讨论】:

标签: xaml uwp


【解决方案1】:

我的第一个想法是它可以这样工作:

     <Style TargetType="Button">
        <Setter Property="i:Interaction.Behaviors">
            <Setter.Value>
                <i:BehaviorCollection>
                    <core:EventTriggerBehavior EventName="Click">
                        <core:InvokeCommandAction Command="{Binding TestCommand}" />
                    </core:EventTriggerBehavior>
                </i:BehaviorCollection>
            </Setter.Value>
        </Setter>
    </Style>

但不幸的是,这只适用于获得附加行为的第一个控件。原因是该值只构造了一次,而BehaviorCollectionAssociatedObject 属性设置为第一个控件。

然后我提出了这个解决方案 - How to add a Blend Behavior in a Style Setter 。 这个想法是创建一个附加属性,手动将行为分配给控件。

基于此,我建议你这样做:

public static class ListViewBehaviorAttacher
{
    public static readonly DependencyProperty IsAttachedProperty = DependencyProperty.RegisterAttached(
        "IsAttached", typeof( bool ), typeof( ListViewBehaviorAttacher ), new PropertyMetadata( default( bool ), IsAttachedChanged ) );

    private static void IsAttachedChanged( DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs )
    {
        var listView = ( ListView )dependencyObject;
        //create the binding
        BehaviorCollection collection = new BehaviorCollection();
        var eventTrigger = new EventTriggerBehavior() { EventName = "ItemClick" };
        var invokeCommandAction = new InvokeCommandAction();
        //binding to command
        BindingOperations.SetBinding( 
            invokeCommandAction, 
            InvokeCommandAction.CommandProperty,
            new Binding() { Path = new PropertyPath( "ShowItemClickedCommand" ), Source = listView.DataContext } );
        eventTrigger.Actions.Add( invokeCommandAction );
        collection.Add( eventTrigger );
        listView.SetValue( Interaction.BehaviorsProperty, collection );
    }

    public static void SetIsAttached( DependencyObject element, bool value )
    {
        element.SetValue( IsAttachedProperty, value );
    }

    public static bool GetIsAttached( DependencyObject element )
    {
        return ( bool )element.GetValue( IsAttachedProperty );
    }
}

然后在样式中像这样附加它:

<Style TargetType="ListView">
   <Setter Property="SelectionMode" Value="None"></Setter>
   <Setter Property="IsItemClickEnabled" Value="True" /> 
   <Setter Property="local:ListViewBehaviorAttacher.IsAttached" Value="True" />
</Style>

【讨论】:

  • 这行得通。感谢您的帮助和出色的示例
猜你喜欢
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
  • 2017-02-15
  • 2017-08-03
相关资源
最近更新 更多