EventToCommandを使用して行のデータグリッドダブルクリックハンドラを設定する方法を理解しようとしています。コマンドは、各行のビューモデル内に存在します。ちょうどその私は多くの経験から、私はまだインタラクションを使用していないので。MvvmLight EventToCommandとWPFToolkit DataGridをダブルクリック
ありがとうございました。
私はmvvmlightタグを使用していましたが、まだ新しいタグを作成するのに十分な高さを持っていません。
EventToCommandを使用して行のデータグリッドダブルクリックハンドラを設定する方法を理解しようとしています。コマンドは、各行のビューモデル内に存在します。ちょうどその私は多くの経験から、私はまだインタラクションを使用していないので。MvvmLight EventToCommandとWPFToolkit DataGridをダブルクリック
ありがとうございました。
私はmvvmlightタグを使用していましたが、まだ新しいタグを作成するのに十分な高さを持っていません。
コマンドが "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のようなものを)コマンドを返すために必要な型であるならば、チェックしますが
Torn ...私はこれを長い間試してみる機会はありませんが、未回答のままにしたくありません。理論的には正しかったのですが、コマンドがRowViewModel上にあった場所が本当に必要でした。
コンバーターの背後にあるアイデアは、コンバーターがSelectedItemをキャストしてコマンドを返すことでした。そうすれば、RowViewModelでコマンドを呼び出すことになります(SelectedItem.SelectCommandのようなことができるかどうかはわかりません) 行がダブルクリックされたかどうかを確認するには、EventArgsが必要です。しかし、あなたはそれをmvvm-lightツールキットで返すことができます。 – CodeWeasel
K、サンプル構文をありがとう。この方法を試してみるともう一度返信します。 – Thomas
場合には、誰もがここで見て来て、私は私の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>
mvvm-lightタグが追加されました。これは、Laurent BugnionのMVVM Lightツールキットに使用する正式なものです。 – dthrasher