我在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上设置断点时,它永远不会到达那里。
答案 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>