C# Datagrid列标题按钮
我在datagrid列的标题中有一个按钮,但它没有绑定到视图模型上的属性 以下是XAML: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 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}”
?这对我很有效。另请参阅更新。如果这些都不起作用,我不知道该说什么。我无法做任何事情来破坏它,因此我无法复制您看到的任何内容。