6

ユーザーが削除ボタンをクリックしてアイテムの一部を削除できる機能を追加したいwpfウィンドウにグリッドがあります。アプリケーションは Calibrun Micro を使用してビューを ViewModel にバインドします。

私の質問?

1- ボタンを使用して WPF のグリッドからアイテムを削除するのは良い考えですか?

2- ボタンを VM のメソッドにバインドし、そのメソッドで削除するアイテムへのポインタを取得するにはどうすればよいですか?

編集1

この方法でボタンをデータグリッドに追加しました。

<DataGridTemplateColumn Width="100">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Button Content="Delete" cal:Message.Attach="DeleteFromList($dataContext)" />
         </DataTemplate>
     </DataGridTemplateColumn.CellTemplate>
 </DataGridTemplateColumn>

および c# コードは次のとおりです。

 public void DeleteFromList(object tmp)
    {

    }

しかし、データグリッドのボタンは無効になっており、それらをクリックしても DeleteFromList メソッドは起動しません (デバッガーを使用して確認しました)。

なぜ彼らは無効になっているのですか?それらを有効にするにはどうすればよいですか?

4

2 に答える 2

9

これは、ボタンの配置方法によって異なります。単一の「削除」ボタンがあるか、グリッドの行ごとにボタンを追加しましたか (話しているの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>

それはうまくいくはずです!

于 2013-09-24T11:37:01.310 に答える