Отфильтровать клики по заголовку столбца

Я использую конструкцию, как описано в этот мой предыдущий вопрос, который выглядит примерно так

<ListView x:Name="listView">

    <ListView.View>
        <GridView />
    </ListView.View>

    <ListView.Resources>
        <Style TargetType="{x:Type ListViewItem}"/>
    </ListView.Resources>

    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseRightButtonUp">
            <i:InvokeCommandAction Command="{Binding RightClickOnItemCommand}"
                                   CommandParameter={Binding SelectedItem,
                                                     ElementName=listView} />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</ListView>

Это работает как шарм, за исключением того, что он срабатывает, когда я щелкаю правой кнопкой мыши заголовки столбцов. Поскольку я получаю SelectedItem только в качестве параметра для команды, а свойство выбранного элемента не очищается при нажатии на заголовок (и я тоже этого не хочу), я не вижу способа решить эту проблему. на стороне модели просмотра.

До сих пор мне очень нравилось это решение, так как оно обеспечивает действительно хороший и чистый способ обработки этих событий, но этот крайний случай сводит меня с ума.

Я знаю, что могу добавить установщик событий в ListViewItem Style, но обработчик, в свою очередь, потребует от меня написания кода программной части, чего я хотел избежать в первую очередь, отсюда и System.Windows.Interactivity-Stuff.

Есть ли такой же хороший и чистый способ предотвратить это (то есть способ, который не требует написания уродливых хаков кода программной части)?


person Janis F    schedule 12.06.2014    source источник
comment
вы можете поместить EventTrigger в ListViewItems через ItemContainerStyle.   -  person Federico Berasategui    schedule 12.06.2014
comment
@HighCore Я не уверен, что понимаю. Я не могу добавить триггеры в <Style TargetType="{x:Type ListViewItem}"/>, поскольку, как говорит мне Intellisense, их можно добавить только к тому, что происходит от объекта зависимости. Хотя, возможно, я ошибаюсь, у меня нет большого опыта разработки с WPF.   -  person Janis F    schedule 12.06.2014
comment
@HighCore Думаю, теперь я понимаю, что вы имели в виду, но потребовался бы тот же обходной путь, чтобы разрешить триггеры в стилях, которые я указал в своем ответе, не так ли?   -  person Janis F    schedule 26.06.2014


Ответы (1)


Проблему можно решить методом, описанным здесь. Класс, разработанный в статье, по существу добавляет присоединенное свойство для хранения триггеров.

    public static readonly DependencyProperty TemplateProperty =
        DependencyProperty.RegisterAttached("Template", 
        typeof(InteractivityTemplate), 
        typeof(InteractivityItems),
        new PropertyMetadata(default(InteractivityTemplate), OnTemplateChanged));

    private static void OnTemplateChanged(
        DependencyObject d, 
        DependencyPropertyChangedEventArgs e)
    {
        InteractivityTemplate dt = (InteractivityTemplate)e.NewValue;
        dt.Seal();
        InteractivityItems ih = (InteractivityItems)dt.LoadContent();
        BehaviorCollection bc = Interaction.GetBehaviors(d);
        TriggerCollection tc = Interaction.GetTriggers(d);

        foreach (Behavior behavior in ih.Behaviors)
            bc.Add(behavior);

        foreach (TriggerBase trigger in ih.Triggers)
            tc.Add(trigger);
    }

Теперь это позволяет добавлять триггеры к отдельным элементам:

<ListView.Resources>
   <Style TargetType="{x:Type ListViewItem}">
       <Setter Property="int:InteractivityItems.Template">
           <Setter.Value>
               <int:InteractivityTemplate>
                   <int:InteractivityItems>
                       <int:InteractivityItems.Triggers>
                           <i:EventTrigger EventName="MouseRightButtonUp">
                               <i:InvokeCommandAction 
                                  Command="{Binding RightClickCommand}" />
                           </i:EventTrigger>
                       </int:InteractivityItems.Triggers>
                   </int:InteractivityItems>
                </int:InteractivityTemplate>
           </Setter.Value>
       </Setter>
   </Style>
</ListView.Resources>

На самом деле это моделирует идею щелчка по элементу вместо щелчка по списку и поиска элемента, который находился под указателем при щелчке по списку.

person Janis F    schedule 26.06.2014