作为我的数据处理的一部分,我生成以下类的DataTable(列数和行数变化)
public class DataGridCell
{
public string Text { get; set; }
public string Background { get; set; }
}
我的计划是将DataGrid绑定到此DataTable;每个单元格应显示DataGridCell.Text值,该单元格的背景颜色应为DataGridCell.Background值。
我已经厌倦了以下
C#
DataTable dtVolume = new DataTable();
for (int i = 0; i < ColumnNames.Length; i++)
{
dtVolume.Columns.Add(ColumnNames[i]);
}
for (double p = max; p > min; p -= 0.05)
{
var row = dtVolume.NewRow();
for (int i = 0; i < ColumnNames.Length; i++)
{
row[i] = new DataGridCell
{
Text = i,
Background = i % 2 == 0 ? "LightGray" : "Red"
};
}
dtVolume.Rows.Add(row);
}
dgVolumes.DataContext = dtVolume.DefaultView;
XAML
<DataGrid x:Name="dgVolumes" ItemsSource="{Binding}">
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="Background" Value="LightGray"/>
</Style>
</DataGrid.CellStyle>
这为我提供了一个DataGrid,其单元格背景设置为LightGray,但显示的文本是Namespace.DataGridCell
由于上下文是DataRowView
,因此{Binding Path = Background}失败,因此下面的XAML出错XAML
<DataGrid x:Name="dgVolumes" ItemsSource="{Binding}">
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="Background" Value="{Binding Path=Background}"/>
</Style>
</DataGrid.CellStyle>
我该怎么做?
此处WPF Binding to a DataGrid from a DataTable of Objects提供的解决方案和Change DataGrid cell colour based on values处的另一个解决方案不会自动生成列。他们使用DataGridTemplateColumn,但在我的情况下,列需要自动生成,因为列(和行)的数量会发生变化。
答案 0 :(得分:0)
什么是dtVolume.DefaultView
?
使用标准绑定可以正常工作,因此我想知道您尝试将DataGrid绑定到哪种对象。
以下是我使用的代码,请告诉我您的不同之处。
ViewModel和cs代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new MyViewModel();
}
}
public class MyViewModel
{
public MyViewModel()
{
Items = new List<DataGridCell>();
for (int i = 0; i < 10; i++)
{
int c = i % 8;
Items.Add(new DataGridCell
{
Text = $"Item #{i}",
Background = $"#{c}{c}{c}{c}{c}{c}"
});
}
}
public List<DataGridCell> Items { get; set; }
}
public class DataGridCell
{
public string Text { get; set; }
public string Background { get; set; }
}
XAML代码:
<Grid>
<DataGrid x:Name="dgVolumes" ItemsSource="{Binding Items}">
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="Background" Value="{Binding Background}"/>
</Style>
</DataGrid.CellStyle>
</DataGrid>
</Grid>
答案 1 :(得分:0)
您无法将DataGridCell
对象真正存储在DataRow
中。有关详细信息,请参阅我的答案:
Binding an object to data grid cell - conditional cell style
将对象模型与此类DataTable
混合使用并不是一个好主意。使用简单的标量列值绑定 IEnumerable<DataGridCell>
或 DataTable
。