WPF MVVM模式下如何将DataGrid数字列设置为右对齐?
如何为WPF DataGrid动态生成的数字列设置右对齐?
我正在用MVVM模式开发WPF应用,把通过LINQ查询得到的动态集合绑定到DataGrid上。我的查询和绑定代码如下:
查询ViewModel中的集合代码
var data = (from main in db.MainSaleInvoiceTbls join detial in db.DetialSaleInvoiceTbls on main.Id equals detial.MainSaleInvoiceId into gDate from gdetial in gDate.DefaultIfEmpty() where main.IsActive == true && main.CompanyId == UniversalInfo.UserCompany.Id && main.MainSaleInvoiceDataType == MainSaleInvoiceType.POInvoice && main.FinancialYearId == UniversalInfo.SelectedFinancialYear.Id orderby main.Id select new { Id=main.Id, Sr_No=0, Date = main.Date.Value, Voucher = main.FinancialVoucher, Invoice_Account = main.Vendor == null ? string.Empty : main.Vendor.AccountCode, Vendor_Name = main.Vendor == null ? string.Empty : main.Vendor.VendorName, Vendor_Group = main.Vendor == null ? string.Empty : main.Vendor.VendorGroup.Name, Invoice = main.SaleOrderPrefix + main.SaleOrderNumber, Purchase_Order = main.SalesId, Sales_Tax = "", Invoice_Amount= gDate.Sum(x=>x.Quantity * x.UnitPrice) }); DataGridCollection = new ObservableCollection<dynamic>(data);
DataGrid的XAML绑定代码
<DataGrid x:Name="miscListDataGrid" VerticalAlignment="Stretch" ScrollViewer.IsDeferredScrollingEnabled="True" VirtualizingPanel.IsContainerVirtualizable="True" VirtualizingPanel.IsVirtualizing="True" EnableRowVirtualization="True" EnableColumnVirtualization="True" ItemsSource="{Binding Path=DataGridCollection,IsAsync=True,Mode=TwoWay,NotifyOnTargetUpdated=True,NotifyOnSourceUpdated=True,ValidatesOnDataErrors=True,UpdateSourceTrigger=PropertyChanged,ValidatesOnExceptions=True}" AutoGenerateColumns="True" Grid.Row="2" RowDetailsVisibilityMode="VisibleWhenSelected" Grid.ColumnSpan="2" CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False" IsReadOnly="True" > </DataGrid>
我的需求是把DataGrid中的所有数字列设置为右对齐。我尝试用AutoGeneratingColumn和RowDetailsVisibilityChanged事件来监听列的初始化时机,但在触发AutoGeneratingColumn事件时,我没办法修改CellStyle或者设置右对齐。想请教一下怎么通过事件触发的方式来实现这个需求?
别担心,AutoGeneratingColumn事件完全可以解决这个问题,你可能只是在事件处理逻辑上没写对。下面是具体的实现步骤:
第一步:在XAML中为DataGrid添加AutoGeneratingColumn事件
首先修改你的DataGrid XAML代码,添加AutoGeneratingColumn事件绑定:
<DataGrid x:Name="miscListDataGrid" <!-- 保留你原有的所有属性 --> AutoGeneratingColumn="miscListDataGrid_AutoGeneratingColumn" > </DataGrid>
第二步:在后台代码中实现事件处理逻辑
在对应的窗口/用户控件的后台代码(比如.xaml.cs文件)中,添加事件处理方法。我们需要判断当前生成的列对应的数据类型是否为数字类型(比如int、double、decimal等),然后给这些列设置右对齐的CellStyle:
private void miscListDataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) { // 定义需要右对齐的数字类型集合 var numericTypes = new[] { typeof(int), typeof(double), typeof(decimal), typeof(float), typeof(long) }; // 处理可空数字类型的情况 var underlyingType = Nullable.GetUnderlyingType(e.PropertyType) ?? e.PropertyType; if (numericTypes.Contains(underlyingType)) { // 创建右对齐的单元格样式 var rightAlignedStyle = new Style(typeof(DataGridCell)); rightAlignedStyle.Setters.Add(new Setter(HorizontalAlignmentProperty, HorizontalAlignment.Right)); // 将样式赋值给当前生成的列 if (e.Column is DataGridBoundColumn boundColumn) { boundColumn.CellStyle = rightAlignedStyle; } } }
为什么之前的尝试可能失败?
你之前可能没正确处理列的类型转换——自动生成的列默认是DataGridBoundColumn(或其子类),需要先判断并转换为此类型才能设置CellStyle。另外,直接修改默认CellStyle的Setter可能不如重新创建独立Style可靠,避免和默认样式的设置冲突。
这个逻辑会自动识别所有数字类型(包括可空的数字类型)的列,并将它们的单元格内容设置为右对齐,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Osama Rizwan
相关产品推荐
相关产品推荐

