1

the xaml code is:

<DockPanel>
    <DataGrid x:Name="Quote" AutoGenerateColumns="False">
        <DataGrid.Columns >
            <DataGridTextColumn      Header="Code" Binding="{Binding Code}"/>
            <DataGridTextColumn      Header="Name" Binding="{Binding Name}"/>
            <DataGridTextColumn      Header="Quantities" Binding="{Binding Quantities}"/>
            <DataGridTextColumn      Header="Price" Binding="{Binding Price}"/>
            <DataGridTextColumn      Header="Cost" Binding="{Binding Cost}"/>
            <DataGridCheckBoxColumn  Header="Done"   Binding="{Binding Done}"/>
        </DataGrid.Columns>
        <DataGrid.RowDetailsTemplate>
            <DataTemplate>
                <Border BorderThickness="0" Background="Beige" Padding="10">
                    <StackPanel Orientation="Horizontal">
                        <Button Command="{Binding Path=DataContext.Renew1Command, RelativeSource= {RelativeSource FindAncestor,AncestorType=DataGrid}}">Call Command</Button>                        
                    </StackPanel>
                </Border>
            </DataTemplate>
        </DataGrid.RowDetailsTemplate>
    </DataGrid>
</DockPanel>

the model is:

public class StockModel
{
    public event PropertyChangedEventHandler PropertyChanged;
    public void propChanged(string propName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propName));
        }
    }   
    private string code;
    public string Code
    {
        get { return code; }
        set
        {
            code = value;
            this.propChanged("Code");
        }
    }                    
    ....          

    private bool done;
    public bool Done
    {
        get { return done; }
        set
        {
            done = value;
            this.propChanged("Done");
        }
    }
    public DelegateCommand Renew1Command;

    public void Renew1(object obj)
    {
        MessageBox.Show("Hello Command");
        System.Console.WriteLine("Hello Command");
    }
    public StockModel()
    {
        Renew1Command = new DelegateCommand();
        this.Renew1Command.ExecuteAction += this.Renew1;
    }             
}

Finally i init the datasource by:

List<StockModel> stockList = new List<StockModel>();
stockList.Add(new StockModel() { Code = "601919", Cost = "8888", Name = "CIB", Done = true, Price = "16.1", Quantities = "200" });
stockList.Add(new StockModel() { Code = "601919", Cost = "8888", Name = "CIB", Done = false, Price = "16.1", Quantities = "100" });
stockList.Add(new StockModel() { Code = "601919", Cost = "8888", Name = "CIB", Done = true, Price = "16.1", Quantities = "100" });
stockList.Add(new StockModel() { Code = "601919", Cost = "8888", Name = "CIB", Done = true, Price = "16.1", Quantities = "200" });
this.Quote.ItemsSource = stockList;

the DataGridTextColumn can display the data of binding source, but i can't click button of DataTemplate to call corresponding action from model. how to fix the binding? Call Command

Martin
  • 76
  • 1
  • 8
Suzuki ali
  • 11
  • 1

1 Answers1

0

move to StockModel class, replace "public DelegateCommand Renew1Command;" with "public DelegateCommand Renew1Command { get; set; }". the problem will be solved.

Suzuki ali
  • 11
  • 1