Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Datagrid列标题按钮_C#_Wpf_Xaml_Mvvm_Datagrid - Fatal编程技术网

C# Datagrid列标题按钮

C# Datagrid列标题按钮,c#,wpf,xaml,mvvm,datagrid,C#,Wpf,Xaml,Mvvm,Datagrid,我在datagrid列的标题中有一个按钮,但它没有绑定到视图模型上的属性 以下是XAML: <DataGrid ItemsSource="{Binding BillingHistoryList}" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding ar_bill_dt}">

我在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路径错误: 在“对象”“按钮”(名称=“”)上找不到“SortData”属性。 BindingExpression:Path=SortData;DataItem='Button'(名称='');目标 元素为“按钮”(名称=“”);目标属性为“命令”(类型 “ICommand”)

如果我将按钮移到datagrid之外,它就会工作。我猜问题在于button属性的路径,但我不知道如何指定它以使其工作

我需要做什么才能让按钮正常工作

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

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; }
}
公共类BillingHistoryViewModel:ValidatingBindableBase、iRegionManager、INavigationAware
{
公共IRegionManager区域管理器{get;set;}
私人ICustomerService(iCU服务);;
私人ITransactionHistoryService(ITransactionHistoryService);
私有字符串\u标题;
公共字符串标题{get=>\u Title;set=>SetProperty(ref\u Title,value);}
公共计费历史视图模型(ICCustomerService服务、ITransactionHistoryService trnsService)
{
Title=“账单历史记录”;
_服务=服务;
_trnsService=trnsService;
SortData=新的DelegateCommand(ExecuteSortData);
}
私有void ExecuteSortData()
{
}
作废GetBillingHistory(内部帐户)
{
var CustId=\u trnsService.GetCustId(帐户);
var BillHistList=新列表();
var BillHistoryEntries=\u trnsService.GetEntriesByCustId(CustId);
十进制运行总计=0.0m;
foreach(BillHistoryEntries中的var条目)
{
var newEntry=新BillHist(条目);
newEntry.RunningTotal=RunningTotal;
runningTotal+=newEntry.ar\u orig\u amt.Value;
BillHistList.Add(新建条目);
}
添加(新BillHist(){ar_bill_dt=DateTime.Now,ar_orig_amt=10.0m,RunningTotal=100.0m});
BillingHistoryList=新建ListCollectionView(BillHistList);
}
私人ICollectionView_BillingHistoryList;
public ICollectionView BillingHistoryList{get=>U BillingHistoryList;set=>SetProperty(ref{U BillingHistoryList,value);}
公共DelegateCommand SortData{get;set;}
}

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

在该
DataGridTextColumn
中,DataContext将是账单历史记录项(BillingHistoryList中的任何项),而不是账单历史记录项集合的所有者。这就是为什么
{Binding ar_bill_dt}
有效:
ar_bill_dt
肯定是账单历史项目的属性

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

<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>


下面是我收到的错误消息:System.Windows.Data错误:4:找不到引用“RelativeSource FindAncestor,AncestorType='System.Windows.Controls.DataGrid',AncestorLevel='1'进行绑定的源。BindingExpression:Path=DataContext.SortData;DataItem=null;目标元素是“按钮”(名称=“”);目标属性是'Command'(类型'ICommand')@Ken Odd。我测试了你的XAML,它成功了。查看我的更新。我复制并粘贴了你的代码,但它仍然无法工作。我用的是棱镜,但我不认为这是造成问题的原因。数据上下文显然适用于除此按钮之外的所有内容!:(我将我的视图模型添加到我的原始帖子中。@Ken谢谢。不过这并不奇怪。如果您命名网格
x:name=“BillingHistoryListGrid”
并绑定
命令=“{Binding DataContext.SortData,ElementName=BillingHistoryListGrid}”
?这对我很有效。另请参阅更新。如果这些都不起作用,我不知道该说什么。我无法做任何事情来破坏它,因此我无法复制您看到的任何内容。