13

DataGridのViewModelにバインドされた次のようにXAMLで定義された顧客のリストを表示しています:

<DataGrid Name="CustomersDataGrid" ItemsSource="{Binding Customers}">
    <DataGrid.Columns>
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Command="{Binding showCustomerCommand}" 
                        Content="{Binding Path=Name}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

グリッドの表示は正常に機能します。個々のお客様の詳細を表示できるようにしたいと思います。以前は、選択した行のバインディングを設定し、次のコマンドにバインドされたボタンをページに持っていました。

RelayCommand _showCustomerCommand;
public ICommand showCustomerCommand
{
    get
    {
        if (_showCustomerCommand == null)
        {
            _showCustomerCommand = new RelayCommand(param => this.ShowCustomer());
        }
        return _showCustomerCommand;
    }
}

private void ShowCustomer()
{
    if (Parent != null)
    {
        // Handle Customer Display Here
    }
}

これはうまくいきました。ただし、選択した行に基づく単一のボタンではなく、個々の行内のボタンをクリックできるようにしたい。上記のXAMLでデータコンテキストが間違っていることは知っていますが、それを修正する方法も、ボタンを押した元の特定の行を渡す方法もわかりません。埋め込まれたボタンを配線するのに役立つすべての提案を感謝しています。

4

3 に答える 3

36

これはあなたを助けます

<DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <Button 
                          Command="{Binding Path=DataContext.showCustomerCommand,       
 RelativeSource= {RelativeSource FindAncestor,
  AncestorType={x:Type DataGrid}}}">
                            </Button>
                        </StackPanel>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
于 2013-02-05T10:57:53.623 に答える
7

この質問/回答は、探しているものと似ています。

行のIDをコマンドパラメータにバインドできます

<Button Click="Button_Click" Command="{Binding showCustomerCommand}" 
    CommandParameter="{Binding Path=ID}">View Details</Button>
于 2012-08-29T15:46:51.703 に答える