我想在另一個DataGrid的行細節模板內添加一個單行DataGrid。
這是我的XAML:
這是我的XAML。
<DataGrid x。 Name="dataGrid" Margin="10,100,10, 96" PreviewKeyDown="DataGrid_PreviewKeyDown" AutoGenerateColumns="False" ItemsSource="{Binding }" AlternatingRowBackground="AliceBlue"/span> CellEditEnding="onCellEditEnding" SelectedItem="{Binding SelectedItem}" >
<DataGrid.Columns>
< DataGridTextColumn Width="*"/span> Header="No" Binding= "{Binding Path=Id, Mode=TwoWay}" IsReadOnly="True" />
< DataGridTextColumn Width="*"/span> Header="Barcode" Binding= "{Binding Path=Barcode, Mode=TwoWay}" />
< DataGridTextColumn Width="*"/span> Header="Item" Binding= "{Binding Path=Item, Mode=TwoWay}" IsReadOnly="True"/>
< DataGridTextColumn Width="*"/span> Header="Quality" Binding= "{Binding Path=Qty, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>。
< DataGridTextColumn Width="*"/span> Header="Mrp" Binding="{Binding Path=Mrp, Mode=TwoWay}" IsReadOnly="True"/>
< DataGridTextColumn Width="*"/span> Header="Discount" Binding= "{Binding Path=Discount, Mode=TwoWay}" IsReadOnly="True"/>
< DataGridTextColumn Width="*"/span> Header="Cgst" Binding="{Binding Path=Cgst, Mode=TwoWay}" IsReadOnly="True"/>
< DataGridTextColumn Width="*"/span> Header="Sgst" Binding= "{Binding Path=Sgst, Mode=TwoWay}" IsReadOnly="True"/>
< DataGridTextColumn Width="*"/span> Header="Amount" Binding= "{Binding Path=Amount, Mode=OneWay ,UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True"/>
< DataGridTextColumn Width="*"/span> Header="Salesman" Binding= "{Binding Path=Salesman, Mode=TwoWay}" IsReadOnly="True"/>
<DataGridTemplateColumn Header="洗掉">
<DataGridTemplateColumn.CellTemplate>/span>
<DataTemplate>/span>
< Button Content="X" Click="Button_Click"/>
</DataTemplate>/span>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>/span>
<DataGrid.RowDetailsTemplate >
<DataTemplate>/span>
<DataGrid x: Name="RowDetailsDataGrid" AutoGenerateColumns="False">
<DataGrid.Columns>/span>
< DataGridTextColumn Width="*" Binding="{Binding Details}" />
< DataGridTextColumn Width="*" Binding="{Binding CgstDetails}"/>
< DataGridTextColumn Width="*" Binding="{Binding SgstDetails}"/>
< DataGridTextColumn Width="*" Binding="{Binding DiscountDetails}"/>
</DataGrid.Columns>
</DataGrid>/span>
</DataTemplate>/span>
</DataGrid.RowDetailsTemplate>/span>
</DataGrid>/span>
這是(大致)我的后臺代碼:
ObservableCollection<TableData> tableData = new ObservableCollection< TableData>();
public MainWindow()
{
InitializeComponent()。
dataGrid.DataContext = tableData。
}
public class TableData : INotifyPropertyChanged ?
{
public int Id { get; set; }
public int No { get; set; }
public string Details { get; set; }
public string CgstDetails { get; set; }
public string SgstDetails { get; set; }
public string DiscountDetails { get; set; }
public string Barcode { get; set; }
public string Item { get; set; }
private double qty。
public double Qty {
get { return qty; }
set { return qty; }
{
qty = value;
OnPropertyChanged("Want")。
}
}
public double Mrp { get; set; }
public double Discount { get; set; }
public double Cgst { get; set; }
public double Sgst { get; set; }
private double amount; // field
public double Amount
{
get { return amount; }
set {
amount = (Quality * Mrp) ((Cgst / 100) * (Mrp * Qty)) ((Sgst / 100) * (Mrp * Quant))。
OnPropertyChanged("Amount"/span>)。
}
}
public int Salesman { get; set; }
public event PropertyChangedEventHandler PropertyChanged。
private void OnPropertyChanged(String propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName))。
}
public bool RowAdded{ get; set; }
}
private void onCellEditEnding(object sender, DataGridCellEditEndingEventArgs e)。
{
var rowFetched = new TableData()
{
Id = currentRowIndex 1,
No = currentRowIndex 1,
Barcode = item.Barcode,
數量 = item.Quality,
Mrp = item.Mrp,
專案 = item.Item,
Discount = item.Discount,
Cgst = item.Cgst,
Sgst = item.Cgst,
Amount = item.Amount,
Salesman = item.Salesman,
Details = item.Details,
DiscountDetails = item.DiscountDetails,
CgstDetails = item.CgstDetails,
SgstDetails = item.SgstDetails,
RowAdded = true
這樣做是不行的。我沒有使用DataGrid,而是在WrapPanel內放置了一個TextBlock(見下面的代碼),資料系結作業非常完美,資料顯示在行的詳細資訊中,但是我希望它是一個行(DataGrid)而不是WrapPanel。
<DataGrid.RowDetailsTemplate >/span>
<DataTemplate>/span>
<WrapPanel Background="LightGray">/span>
< Border BorderBrush="Black" BorderThickness="1""1" Width="355" Padding="40 0 0 0" >
< TextBlock FontSize="16" Foreground="MidnightBlue" Text="{Binding Details}" VerticalAlignment="Center" />
</Border>
< Border BorderBrush="Black"/span> BorderThickness="1"/span> Width="71"/span>>
< TextBlock FontSize="16"/span> Foreground="MidnightBlue" Text="{Binding CgstDetails}" VerticalAlignment="Center" />。
</Border>
< Border BorderBrush="Black"/span> BorderThickness="1"/span> Width="71"/span>>
< TextBlock FontSize="16"/span> Foreground="MidnightBlue" Text="{Binding SgstDetails}" VerticalAlignment="Center" />
</Border>
< Border BorderBrush="Black"/span> BorderThickness="1"/span> Width="71"/span>>
< TextBlock FontSize="16"/span> Foreground="MidnightBlue" Text="{Binding DiscountDetails}" VerticalAlignment="Center" />。
</Border>
< Border BorderBrush="Black"/span> BorderThickness="1" Width="188" >
< TextBlock FontSize="16" Foreground="MidnightBlue" VerticalAlignment="Center" />
</Border>
</WrapPanel>/span>
</DataTemplate>/span>
</DataGrid.RowDetailsTemplate>
如果有人能幫忙的話?
uj5u.com熱心網友回復:
我認為把一個嵌套的DataGrid放到行的細節模板中,只是為了顯示一個單行,這不是一個好主意,但如果這是你唯一的選擇,你可以按以下方法做。
一個DataGrid期望一個ItemsSource的集合型別,更確切地說,是IEnumerable。你試圖做的是直接在DataContext本身上系結屬性,這是不可行的。你至少有兩個選項可以使其作業,這兩個選項基本上都提供了一個單一專案的集合作為ItemsSource到嵌套的DataGrid。
創建一個值轉換器,將你的TableData項包裹在一個集合中(這里是一個陣列)。
public class ItemToCollectionConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)。
{
return value is null ? null : new[] { value };
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)。
{
throw new InvalidOperationException();
}
在XAML中創建一個轉換器的實體(例如在你的DataGrid.Resources中),并簡單地使用轉換器將資料背景關系系結到嵌套的DataGrid的ItemsSource。這樣,你的TableData項被包裹在一個集合中,并被視為一個單一的專案集合,所以列系結將正確作業。
<DataGrid x: Name="dataGrid" Margin="10,100,10, 96" PreviewKeyDown="DataGrid_PreviewKeyDown" AutoGenerateColumns="False" ItemsSource="{Binding}" AlternatingRowBackground="AliceBlue"/span> CellEditEnding="onCellEditEnding" SelectedItem="{Binding SelectedItem}" >
<DataGrid.Resources>
<local:ItemToCollectionConverter x:Key="ItemToCollectionConverter"/>
</DataGrid.Resources>/span>
<DataGrid.Columns>/span>
< DataGridTextColumn Width="*"/span> Header="No" Binding= "{Binding Path=Id, Mode=TwoWay}" IsReadOnly="True" />
< DataGridTextColumn Width="*"/span> Header="Barcode" Binding= "{Binding Path=Barcode, Mode=TwoWay}" />
< DataGridTextColumn Width="*"/span> Header="Item" Binding= "{Binding Path=Item, Mode=TwoWay}" IsReadOnly="True"/>
< DataGridTextColumn Width="*"/span> Header="Quality" Binding= "{Binding Path=Qty, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>。
< DataGridTextColumn Width="*"/span> Header="Mrp" Binding="{Binding Path=Mrp, Mode=TwoWay}" IsReadOnly="True"/>
< DataGridTextColumn Width="*"/span> Header="Discount" Binding= "{Binding Path=Discount, Mode=TwoWay}" IsReadOnly="True"/>
< DataGridTextColumn Width="*"/span> Header="Cgst" Binding="{Binding Path=Cgst, Mode=TwoWay}" IsReadOnly="True"/>
< DataGridTextColumn Width="*"/span> Header="Sgst" Binding= "{Binding Path=Sgst, Mode=TwoWay}" IsReadOnly="True"/>
< DataGridTextColumn Width="*"/span> Header="Amount" Binding= "{Binding Path=Amount, Mode=OneWay ,UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True"/>
< DataGridTextColumn Width="*"/span> Header="Salesman" Binding= "{Binding Path=Salesman, Mode=TwoWay}" IsReadOnly="True"/>
<DataGridTemplateColumn Header="洗掉">
<DataGridTemplateColumn.CellTemplate>/span>
<DataTemplate>/span>
< Button Content="X" Click="Button_Click"/>
</DataTemplate>/span>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>/span>
<DataGrid.RowDetailsTemplate>/span>
<DataTemplate>/span>
<DataGrid x: 名稱="RowDetailsDataGrid" AutoGenerateColumns="False" ItemsSource="{Binding Converter={StaticResource ItemToCollectionConverter}}" >
<DataGrid.Columns>
< DataGridTextColumn Width="*" Binding="{Binding Details}" />
< DataGridTextColumn Width="*" Binding="{Binding CgstDetails}"/>
< DataGridTextColumn Width="*" Binding="{Binding SgstDetails}"/>
< DataGridTextColumn Width="*" Binding="{Binding DiscountDetails}"/>
</DataGrid.Columns>
</DataGrid>/span>
</DataTemplate>/span>
</DataGrid.RowDetailsTemplate>/span>
</DataGrid>/span>
從你的TableData型別中暴露一個集合屬性,該型別包含一個子型別或輔助型別的單項,該型別只包含細節屬性。
public class TableDetailsData
{
public string Details { get; set; }
public string CgstDetails { get; set; }
public string SgstDetails { get; set; }
public string DiscountDetails { get; set; }
public class TableData : INotifyPropertyChanged
{
private TableDetailsData _detailsData;
public TableDetailsData DetailsData
{
get => _detailsData;
set
{
_detailsData = value;
DetailsDataCollection = new List<TableDetailsData> { _detailsData };
OnPropertyChanged(nameof(DetailsDataCollection))。
}
}
public IEnumerable<TableDetailsData> DetailsDataCollection { get; private set; }
//......其他代碼。。
}
當DetailsData發生變化時,DetailsDataCollection總是被更新。你是否像這樣創建一個集合,并將DetailsData作為物件或作為屬性公開,這取決于你,有許多可能性,這只是為了得到一個想法。現在你可以在嵌套的DataGrid中把這個集合系結為ItemsSource。
<DataGrid x: Name="RowDetailsDataGrid"/span> AutoGenerateColumns="False"/span> ItemsSource="{Binding DetailsDataCollection}" CanUserAddRows="False"/span>>
個人而言,我更喜歡值轉換器的解決方案,因為你不必暴露一個多余的集合屬性并污染你的代碼,因為這不是一個相當干凈的解決方案。我建議你創建一個適當的細節型別,并考慮一個更好的方式來表示資料,而不是一個單行的DataGrid,這似乎不合適,在這種情況下不能提供良好的用戶體驗。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/312743.html
標籤:
