过滤列标题的点击次数

时间:2014-06-12 14:30:51

标签: wpf xaml blend

我正在使用this早先的问题中描述的构造,看起来像

<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作为命令的参数,并且当您单击标题时所选项属性不会清除(我也不想要它),我看不到解决此问题的方法在viewmodel方面。

到现在为止,我真的很喜欢这个解决方案,因为它提供了一种非常好用且干净的方式来处理这些事件,但是这个角落的情况让我发疯了。

我知道我可以在ListViewItem样式中添加一个事件设置器,但是处理程序会依次要求我编写代码隐藏,我想首先避免它,因此{{1 }} - 。东西

是否有一种同样漂亮和干净的方法来防止这种情况发生(即一种不会让我编写丑陋的代码隐藏黑客攻击的方式)?

1 个答案:

答案 0 :(得分:0)

问题可以通过here描述的方法解决。本文中开发的类实质上添加了一个附加属性来保存触发器。

    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>

这实际上模拟了单击项目而不是单击列表并在单击列表时查找指针下方的项目的想法。