UWP определить eventrigger поведение в стиле

225 просмотра

1 ответ

Я в настоящее время застрял с проблемой. Я хочу объявить обработчик событий для всех моих списков. это мой код:

<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. Но я не хочу, чтобы такое поведение отображалось в одном списке, я хочу, чтобы оно было во всех моих списках.

Есть ли способ сделать это?

Автор: Sebastian S Источник Размещён: 08.11.2019 11:00

Ответы (1)


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>

Но, к сожалению, это работает только для первого элемента управления, который привязывает поведение. Причина заключается в том, что значение создается только один раз, и для AssociatedObjectсвойства BehaviorCollectionустанавливается первый элемент управления.

Затем я подошел к этому решению - Как добавить Blend Behavior в 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>
Автор: Martin Zikmund Размещён: 20.08.2016 10:45
Вопросы из категории :
32x32