DataGridでMouseDoubleClickイベントを使用してselectedvalueを取得する方法は知っていますが、代わりにコマンドバインディングを使用する方法を教えてください。そうすれば、私のViewModelはロジックを処理できます。
これまでのところ、私は以下を持っています:
<DataGrid Name="TestGrid" Grid.Row="2" Grid.ColumnSpan="2" AutoGenerateColumns="True" MouseDoubleClick="TestGrid_MouseDoubleClick"
ItemsSource="{Binding Registrations}" SelectedValue="{Binding CurrentRegistration}" IsReadOnly="True" AlternationCount="2" GridLinesVisibility="None">
MouseDoubleClickを取り除き、適切に置き換えたい。
ここでは、アタッチされた動作やカスタムDataGridサブクラスは必要ありません。
DataGrid
で、ItemsSource
をICollectionView
にバインドします。ここでのコツは、IsSynchronizedWithCurrentItem="True"
これは、選択した行が現在のアイテムになることを意味します。
トリックの2番目の部分は、スラッシュ記号を使用してCommandParameter
を現在のアイテムにバインドすることです。
行がダブルクリックされると、クリックされた行を引数としてコマンドが実行されます。
<DataGrid
ItemsSource="{Binding CollectionView}"
IsSynchronizedWithCurrentItem="True">
<DataGrid.InputBindings>
<MouseBinding
MouseAction="LeftDoubleClick"
Command="{Binding DoubleClickCommand}"
CommandParameter="{Binding CollectionView/}"/>
</DataGrid.InputBindings>
</DataGrid>
これは、ビューモデルの(簡略化された)バージョンの外観です。
class MyViewModel
{
public ICollectionView CollectionView { get; set; }
public ICommand DoubleClickCommand { get; set; }
}
別の解決策は、入力バインディングを追加し、selectedItemをプロパティにバインドして、選択されたものがわかるようにすることです。
<DataGrid SelectedItem="{Binding SelectedItem}">
<DataGrid.InputBindings>
<MouseBinding Gesture="LeftDoubleClick" Command="{Binding SomeCommand}"/>
</DataGrid.InputBindings>
</DataGrid>
このライブラリ を使用します
データグリッドイベントへのサンプルバインド:
<DataGrid xmlns:command="clr-namespace:AttachedCommandBehavior;Assembly=AttachedCommandBehavior"
command:CommandBehavior.Event="MouseDoubleClick"
command:CommandBehavior.Command="{Binding TestCommand}" />
ただし、行のクリックのみが発生するため、このコードの方が優れています。
<DataGrid>
<DataGrid.Resources>
<Style TargetType="DataGridRow">
<Setter Property="command:CommandBehavior.Event" Value="MouseDoubleClick"/>
<Setter Property="command:CommandBehavior.Command" Value="{Binding DataContext.TestCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}"/>
</Style>
</DataGrid.Resources>
</DataGrid>
または、派生クラスを作成できます
public class CustomDataGrid : DataGrid
{
public ICommand DoubleClickCommand
{
get { return (ICommand)GetValue(DoubleClickCommandProperty); }
set { SetValue(DoubleClickCommandProperty, value); }
}
// Using a DependencyProperty as the backing store for DoubleClickCommand. This enables animation, styling, binding, etc...
public static readonly DependencyProperty DoubleClickCommandProperty =
DependencyProperty.Register("DoubleClickCommand", typeof(ICommand), typeof(CustomDataGrid), new UIPropertyMetadata());
public CustomDataGrid()
: base()
{
this.PreviewMouseDoubleClick += new MouseButtonEventHandler(CustomDataGrid_PreviewMouseDoubleClick);
}
void CustomDataGrid_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
if (DoubleClickCommand != null)
{
DoubleClickCommand.Execute(null);
}
}
}
xAMLでは、新しく作成されたコマンドに単純にバインドします
<CustomDataGrid DoubleClickCommand="{Binding DoubleClickCommand}">