Datagrid列标题按钮

时间:2017-11-09 19:25:35

标签: c# wpf xaml mvvm datagrid

我在datagrid列的标题中有一个按钮,但它没有绑定到视图模型上的属性。

这是XAML:

    <DataGrid ItemsSource="{Binding BillingHistoryList}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding ar_bill_dt}">
                <DataGridTextColumn.Header>
                    <Button Content="Bill Date" Command="{Binding SortData}" />
                </DataGridTextColumn.Header>
            </DataGridTextColumn>
            <DataGridTextColumn Header="Amount" Binding="{Binding ar_orig_amt}" />
            <DataGridTextColumn Header="Running Total" Binding="{Binding RunningTotal}" />
        </DataGrid.Columns>
    </DataGrid>

数据显示在网格中,但是当我按下按钮时它不会执行。输出中的错误是:

  

System.Windows.Data错误:40:BindingExpression路径错误:   &#39; SortData&#39;在&#39; object&#39;上找不到的属性&#39;&#39;按钮&#39; (名称=&#39;&#39;)&#39 ;.   BindingExpression:路径= SortData;的DataItem =&#39;按钮&#39; (名称=&#39;&#39);目标   元素是&#39; Button&#39; (名称=&#39;&#39);目标财产是&#39; Command&#39; (类型   &#39; ICommand的&#39)

如果我在数据网格外移动按钮,它就可以工作。我猜测问题是按钮属性的路径,但我不知道如何指定它以使其有效。

要让按钮工作,我需要做什么?

以下是视图模型的相关部分:

public class BillingHistoryViewModel: ValidatingBindableBase, IRegionManagerAware, INavigationAware
{
    public IRegionManager RegionManager { get; set; }

    private ICustomerService _service;
    private ITransactionHistoryService _trnsService;
    private string _Title;
    public string Title { get => _Title; set => SetProperty(ref _Title, value); }

    public BillingHistoryViewModel(ICustomerService service, ITransactionHistoryService trnsService)
    {
        Title = "Billing History";
        _service = service;
        _trnsService = trnsService;
        SortData = new DelegateCommand(ExecuteSortData);
    }

    private void ExecuteSortData()
    {
    }


    void GetBillingHistory(int account)
    {
        var CustId = _trnsService.GetCustId(account);

        var BillHistList = new List<BillHist>();

        var BillHistoryEntries = _trnsService.GetEntriesByCustId(CustId);

        decimal runningTotal = 0.0m;

        foreach(var entry in BillHistoryEntries)
        {
            var newEntry = new BillHist(entry);

            newEntry.RunningTotal = runningTotal;
            runningTotal += newEntry.ar_orig_amt.Value;

            BillHistList.Add(newEntry);
        }

        BillHistList.Add(new BillHist() {ar_bill_dt=DateTime.Now, ar_orig_amt=10.0m, RunningTotal = 100.0m });
        BillingHistoryList = new ListCollectionView(BillHistList);
    }


    private ICollectionView _BillingHistoryList;
    public ICollectionView BillingHistoryList { get => _BillingHistoryList; set => SetProperty(ref _BillingHistoryList, value); }

    public DelegateCommand SortData { get; set; }
}

当我在ExecuteSort上设置断点时,它永远不会到达那里。

1 个答案:

答案 0 :(得分:1)

DataGridTextColumn中,DataContext将成为记帐历史记录项(BillingHistoryList中的任何内容),而不是记帐历史记录项集合的所有者。这就是{Binding ar_bill_dt}工作的原因:ar_bill_dt肯定是结算历史记录项的属性。

如果SortData是拥有BillingHistoryList的同一视图模型的属性,请尝试以下操作:

<DataGrid ItemsSource="{Binding BillingHistoryList}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding ar_bill_dt}">
            <DataGridTextColumn.Header>
                <Button 
                    Content="Bill Date" 
                    Command="{Binding DataContext.SortData, RelativeSource={RelativeSource AncestorType=DataGrid}}" 
                    />
            </DataGridTextColumn.Header>
        </DataGridTextColumn>
        <DataGridTextColumn Header="Amount" Binding="{Binding ar_orig_amt}" />
        <DataGridTextColumn Header="Running Total" Binding="{Binding RunningTotal}" />
    </DataGrid.Columns>
</DataGrid>

另一个版本。无论如何,这是一种更可敬的方式:

<DataGridTextColumn Binding="{Binding ar_bill_dt}">
    <DataGridTextColumn.HeaderTemplate>
        <DataTemplate>
            <Button 
                Content="Bill Date" 
                Command="{Binding DataContext.SortData, RelativeSource={RelativeSource AncestorType=DataGrid}}" 
                />
        </DataTemplate>
    </DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>