2009-12-10 12 views
5

EventToCommandを使用して行のデータグリッドダブルクリックハンドラを設定する方法を理解しようとしています。コマンドは、各行のビューモデル内に存在します。ちょうどその私は多くの経験から、私はまだインタラクションを使用していないので。MvvmLight EventToCommandとWPFToolkit DataGridをダブルクリック

ありがとうございました。

私はmvvmlightタグを使用していましたが、まだ新しいタグを作成するのに十分な高さを持っていません。

+0

mvvm-lightタグが追加されました。これは、Laurent BugnionのMVVM Lightツールキットに使用する正式なものです。 – dthrasher

答えて

11

コマンドが "GridViewModel"にあり、 "RowViewModel"にない場合は、これが解決策になります。

<Window...  
     ...xmlns:dg="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit" 
      xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
      xmlns:GalaSoft_MvvmLight_Command="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras"> 
     <dg:DataGrid x:Name="dg"> 
        <i:Interaction.Triggers> 
         <i:EventTrigger EventName="MouseDoubleClick"> 
          <GalaSoft_MvvmLight_Command:EventToCommand CommandParameter="{Binding SelectedItem, ElementName=dg}" Command="{Binding Path=SelectCommand, Mode=OneWay}"/> 
         </i:EventTrigger> 
        </i:Interaction.Triggers> 
      </dg:DataGrid> 
    </Window> 

あなたは、行も独自のviewmodelを持っているのでrowviewを作成し、rowviewの行(コンテナ)の子要素のmousedoubleclickイベントを使用することができます。

それとも結合あなたのコマンドのためのコンバータを作成:

<GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding SelectedItem, ElementName=dg, Mode=OneWay, Converter=...}"/> 

コンバータのSelectedItemは(RelayCommandプロパティとISelectCommandableのようなものを)コマンドを返すために必要な型であるならば、チェックしますが

+0

Torn ...私はこれを長い間試してみる機会はありませんが、未回答のままにしたくありません。理論的には正しかったのですが、コマンドがRowViewModel上にあった場所が本当に必要でした。 または、おそらく、DataGridが関連する行の識別をサポートするダブルクリックを提供していないことを意味していますか? – Thomas

+0

コンバーターの背後にあるアイデアは、コンバーターがSelectedItemをキャストしてコマンドを返すことでした。そうすれば、RowViewModelでコマンドを呼び出すことになります(SelectedItem.SelectCommandのようなことができるかどうかはわかりません) 行がダブルクリックされたかどうかを確認するには、EventArgsが必要です。しかし、あなたはそれをmvvm-lightツールキットで返すことができます。 – CodeWeasel

+0

K、サンプル構文をありがとう。この方法を試してみるともう一度返信します。 – Thomas

4

場合には、誰もがここで見て来て、私は私のXAMLで、W/O EventToCommand

public class DataGridAttachedBehaviors 
{ 
    #region DoubleClick 

    public static DependencyProperty OnDoubleClickProperty = DependencyProperty.RegisterAttached(
     "OnDoubleClick", 
     typeof(ICommand), 
     typeof(DataGridAttachedBehaviors), 
     new UIPropertyMetadata(DataGridAttachedBehaviors.OnDoubleClick)); 

    public static void SetOnDoubleClick(DependencyObject target, ICommand value) 
    { 
     target.SetValue(DataGridAttachedBehaviors.OnDoubleClickProperty, value); 
    } 

    private static void OnDoubleClick(DependencyObject target, DependencyPropertyChangedEventArgs e) 
    { 
     var element = target as Control; 
     if (element == null) 
     { 
     throw new InvalidOperationException("This behavior can be attached to a Control item only."); 
     } 

     if ((e.NewValue != null) && (e.OldValue == null)) 
     { 
     element.MouseDoubleClick += MouseDoubleClick; 
     } 
     else if ((e.NewValue == null) && (e.OldValue != null)) 
     { 
     element.MouseDoubleClick -= MouseDoubleClick; 
     } 
    } 

    private static void MouseDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     UIElement element = (UIElement)sender; 
     ICommand command = (ICommand)element.GetValue(DataGridAttachedBehaviors.OnDoubleClickProperty); 
     command.Execute(null); 
    } 

    #endregion DoubleClick 

    #region SelectionChanged 
    //removed 
    #endregion 
} 

それをやってしまったか不思議:

<dg:DataGrid.RowStyle> 
    <Style BasedOn="{StaticResource DataGridDemoRowStyle}"   
      TargetType="{x:Type dg:DataGridRow}"> 
     <Setter Property="skins:DataGridAttachedBehaviors.OnDoubleClick" 
       Value="{Binding Recall}" /> 
    </Style> 
</dg:DataGrid.RowStyle> 
+0

これを見て、詳細を見過ぎて過ごすことなく、実際にここにEventToCommandライトを実装していませんか? – carlsb3rg

+0

これは、ダブルクリックすると非常に固有なので、私はそれを呼び出すことができるかどうかわかりませんが、確かです。 – Thomas

関連する問題