これは、ボタンの配置方法によって異なります。単一の「削除」ボタンがあるか、グリッドの行ごとにボタンを追加しましたか (話しているのDataGrid
か、それとも単にGrid
?)
について話していると仮定するとDataGrid
、簡単にアクション メッセージ コマンドをボタンに追加し、削除されるアイテムを VM のメッセージ ハンドラに渡すことができます。
たとえば VM で
public class MyViewModel
{
public DataItemCollectionTypeName ItemCollection { get; set; }
public void DeleteItem(DataItemTypeName item)
{
ItemCollection.Remove(item);
}
}
がグリッドにバインドされていると仮定するとItemCollection
、ボタンの XAML は次のようになります。
<Button cal:Message.Attach="[Click] = [DeleteItem($datacontext)]" />
これがテンプレート化された行である場合は、設定する必要がある場合もありますAction.TargetWithoutContext
(VM にバインドする必要があります)。そうしないと、CM が VM を見つけてアクション メッセージを呼び出すことができなくなります。
グリッド内に含まれていない単一のボタンがある場合はSelectedItem
、アクション メッセージで常にグリッドをターゲットにすることができます。
<DataGrid x:Name="SomeDataGrid"></DataGrid>
<Button cal:Message.Attach="[Click] = [DeleteItem(SomeDataGrid.SelectedItem)]" />
CM が参照する既定のプロパティである可能性があります (おそらくそうです)。したがって、既定の規則を変更していない限り、プロパティ名を指定する必要はありません。
<DataGrid x:Name="SomeDataGrid"></DataGrid>
<Button cal:Message.Attach="[Click] = [DeleteItem(SomeDataGrid)]" />
編集
明確にするために: CM が VM を見つけてDeleteItem
メソッドを呼び出すためDataContext
に、現在のアイテムの を使用します。派生コントロールの場合、ItemsControl
各項目のデータ コンテキストは、ViewModel ではなく、バインドされている項目を指します。
CM にメソッドを解決しようとするオブジェクトに関するヒントを与えるためにDeleteItem
、添付プロパティを使用できます。これは、バインドされた行/アイテムのAction.TargetWithoutContext
を変更せずに、アクション メッセージのターゲット オブジェクトを適用します。DataContext
要素名の構文を使用して、正しい場所を指すことができます。
この例では、グリッドをルート要素として使用し、名前を付けました。次に、構文を使用しLayoutRoot
てアクション メッセージのターゲットLayoutRoot.DataContext
(ViewModel になります) を指定しました。ElementName
任意の方法(AncestorType
または何でも)を使用できます
<Grid x:Name="LayoutRoot">
<DataGridTemplateColumn Width="100">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="Delete" cal:Message.Attach="DeleteFromList($dataContext)" cal:Action.TargetWithoutContext="{Binding DataContext, ElementName=LayoutRoot}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</Grid>
それはうまくいくはずです!