Как мне выровнять числовые c столбцы DataGrid справа в подходе WPF MVVM? - PullRequest
0 голосов
/ 09 мая 2020

Я привязываю динамическую c коллекцию к datagrid из ViewModel, используя подход MVVM, например:

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>

введите описание изображения здесь

Мое требование: как выровнять numeri c col по правой стороне? Я попытался использовать события AutoGeneratingColumn и RowDetailsVisibilityChanged, чтобы узнать, когда DataGrid инициализирует свои столбцы и запускает эти события. AutoGeneratingColumn срабатывает при первом заполнении столбцов в сетке. это не позволяет изменить CellStyle или Alignment на правую сторону. Если бы кто-нибудь мог пролить свет на то, как событие запускается для форматирования столбцов, это действительно помогло бы.

Спасибо за ваше время.

1 Ответ

0 голосов
/ 09 мая 2020

Следующий код следует использовать, когда DataGrid.AutogenerateColumns установлен на True.

При создании столбцов вручную в XAML вы просто указываете DataGridBoundColumn.ElementStyle.

В обоих сценариях ios Style должен быть нацелен на TextBlock. Это связано с тем, что платформа по умолчанию создает TextBlock в качестве хоста содержимого ячейки (или CheckBox для логических значений).

Выравнивание ячеек DataGridTextColumn достигается путем установки свойства TextBlock.TextAlignment хоста содержимого ячейки через DataGridTextColumn.ElementStyle.

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

MainWindow.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;
    }
  }
}
...