2016-02-29 71 views
1

我知道如何使用代碼隱藏的方式在DataGrid的WPF處理標題單擊事件:如何在MVVM的上下文中處理DataGrid中的Header點擊事件?

<DataGrid> 
    <DataGrid.Resources> 
     <Style TargetType="DataGridColumnHeader"> 
      <EventSetter Event="Click" Handler="columnHeader_Click" /> 
     </Style> 
    </DataGrid.Resources> 
</DataGrid> 

不過,我想在MVVM的情況下處理此事件。我試圖通過System.Windows.Interactivity來處理,但我不能找出我應該的EventName裏面寫:

<DataGrid> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="What event can I use?" 
    </i:Interaction.Triggers> 
</DataGrid> 

我見過的事件,如ColumnReorderedColumnReordering,但它是不適用的。

如何在MVVM的上下文中處理DataGrid WPF中的Header單擊事件?

+0

@downvoter反對的原因是什麼? – StepUp

+0

當然是事件的名稱。所以「點擊」 – CathalMF

+0

@CathalMF沒有這樣的事件! – StepUp

回答

1

您需要在標題樣式中設置觸發器。因爲TriggerCollection和BehaviorCollection類是密封的,所以交互觸發器和行爲通常不能在樣式中設置,因此您無法在XAML中聲明它們。然而,用戶vspivak發佈a workaround for this on the wordpress site基本上創建自己的名單,並讓他們與那些在交互列表同步:

using System.Collections.Generic; 
using System.Windows; 
using System.Windows.Interactivity; 

namespace YourApplication 
{ 
    /// <summary> 
    /// <see cref="FrameworkTemplate"/> for InteractivityElements instance 
    /// <remarks>Subclassed for forward compatibility, perhaps one day <see cref="FrameworkTemplate"/> </remarks> 
    /// <remarks>will not be partially internal</remarks> 
    /// </summary> 
    public class InteractivityTemplate : DataTemplate 
    { 

    } 

    /// <summary> 
    /// Holder for interactivity entries 
    /// </summary> 
    public class InteractivityItems : FrameworkElement 
    { 
     private List<Behavior> _behaviors; 
     private List<System.Windows.Interactivity.TriggerBase> _triggers; 

     /// <summary> 
     /// Storage for triggers 
     /// </summary> 
     public List<System.Windows.Interactivity.TriggerBase> Triggers 
     { 
      get 
      { 
       if (_triggers == null) 
        _triggers = new List<System.Windows.Interactivity.TriggerBase>(); 
       return _triggers; 
      } 
     } 

     /// <summary> 
     /// Storage for Behaviors 
     /// </summary> 
     public List<Behavior> Behaviors 
     { 
      get 
      { 
       if (_behaviors == null) 
        _behaviors = new List<Behavior>(); 
       return _behaviors; 
      } 
     } 

     #region Template attached property 

     public static InteractivityTemplate GetTemplate(DependencyObject obj) 
     { 
      return (InteractivityTemplate)obj.GetValue(TemplateProperty); 
     } 

     public static void SetTemplate(DependencyObject obj, InteractivityTemplate value) 
     { 
      obj.SetValue(TemplateProperty, value); 
     } 

     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; 
#if(!SILVERLIGHT) 
      dt.Seal(); 
#endif 
      InteractivityItems ih = (InteractivityItems)dt.LoadContent(); 
      BehaviorCollection bc = Interaction.GetBehaviors(d); 
      System.Windows.Interactivity.TriggerCollection tc = Interaction.GetTriggers(d); 

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

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

     #endregion 
    } 
} 

有了這個地方是它應用到ColumnHeaderStyle一個簡單的問題:

<DataGrid.ColumnHeaderStyle> 
     <Style TargetType="DataGridColumnHeader"> 
      <Setter Property="local:InteractivityItems.Template"> 
       <Setter.Value> 
        <local:InteractivityTemplate> 
         <local:InteractivityItems> 
          <local:InteractivityItems.Triggers> 
           <i:EventTrigger EventName="Click" > 
            <i:InvokeCommandAction Command="{Binding DataContext.YourCommand, 
             RelativeSource={RelativeSource AncestorType=DataGrid}}" /> 
           </i:EventTrigger> 
          </local:InteractivityItems.Triggers> 
         </local:InteractivityItems> 
        </local:InteractivityTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </DataGrid.ColumnHeaderStyle> 

位kludgy,但它的作品。

相關問題