簡體   English   中英

如何在 WPF MVVM 方法中將 DataGrid 的數字列向右對齊?

[英]How do I allign numeric columns of a DataGrid to the right in WPF MVVM approach?

我使用 MVVM 方法將動態集合從ViewModel綁定到datagrid網格,如下所示:

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

XML 數據綁定到網格的代碼是:

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

在此處輸入圖像描述

我的要求是如何將數字 col 對齊到右側? 我嘗試使用AutoGeneratingColumnRowDetailsVisibilityChanged事件來找出 DataGrid 何時初始化其列並觸發這些事件。 當列第一次填充到網格中時, AutoGeneratingColumn會觸發。 它不允許將CellStyleAlignment更改為右側。 如果有人可以闡明如何觸發事件以格式化列,那將真的很有幫助。

謝謝你的時間。

DataGrid.AutogenerateColumns設置為True時,應使用以下代碼。

在 XAML 中手動創建列時,您只需指定DataGridBoundColumn.ElementStyle

在這兩種情況下, Style都必須以TextBlock為目標。 這是因為默認情況下,框架將生成一個TextBlock作為單元格內容宿主(或 boolean 值的CheckBox )。

DataGridTextColumn.ElementStyle的單元格 alignment 是通過DataGridTextColumn設置單元格內容宿主的TextBlock.TextAlignment屬性來實現的。

主窗口.xaml

<Window>
  <Window.Resources>    
    <Style x:Key="NumericDataGridCellStyle" TargetType="TextBlock">
      <Setter Property="TextAlignment" Value="Right" />
    </Style>
  </Window.Resources>  

  <DataGrid AutoGenerateColumns="True" 
            AutoGeneratingColumn="DataGrid_OnAutoGeneratingColumn" />
</Window>

主窗口.xaml.cs

partial class MainWindow
{
  private void DataGrid_OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
  {
    if (!(e.Column is DataGridTextColumn textColumn))
    {
      return;
    }

    var columnIsNumeric = e.PropertyType == typeof(decimal) 
      || e.PropertyType == typeof(int) 
      || e.PropertyType == typeof(double);
    if (columnIsNumeric)
    {
      var numericCellStyle = FindResource("NumericDataGridCellStyle") as Style;
      textColumn.ElementStyle = numericCellStyle;
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM