我有一个数据网格,它在的开头定义
DataGrid dtgWatch;
并链接到数据集dtsWatch;
dtgWatch.ItemsSource = dtsWatch.Tables[0].DefaultView;
在中间,数据集填充了带有的行
dtsWatch.Tables[0].Rows.Add(string1, string2);
目的类似于以下选项卡:
|string1_A|string2_A|
|string1_B|string2_B|
|string1_B|string2_C|
正常工作。现在的变化是:在推理的一点上(并且只针对一行(,我必须放一个图像,而不是字符串。这意味着:
|string1_A|string2_A|
|字符串1_B|Image2_B|<---------------
|string1_B|string2_C|
理论上讲,这应该有效(没有编译错误(,因为在图像的情况下,我正在添加带有的行
Image img =...
dtsWatch.Tables[0].Rows.Add(string1, img);
但结果是
|string1|System.Windows.Controls.Image|
我想到的一个可能的解决方案是在某个地方放置一个标记,然后在运行时(加载行事件或类似事件(更改带有图像的单元格的内容。不幸的是,我可以这样做,因为我可以直接访问和修改单元格。
我正在用C#wpf和appdomain技术做这一切。这意味着我没有xaml,我必须在代码后面做所有事情。我所拥有的只是一个与数据网格一起添加的网格。
我尝试过,但没有完成,我发现的所有其他解决方案都暗示使用xaml
感谢的帮助
Patrick
要实现所需的行为,您必须手动创建DataGridColumns。
您仍然可以编写Xaml,因为您可以在代码背后轻松地解析和创建相应的对象。参见System.Windows.Markup.XamlReader.Load
所以这应该对你有效
dtgWatch.AutoGenerateColumns = false;
foreach (DataColumn column in dtsWatch.Tables[0].Columns)
{
string dataGridTemplateColumn = $@"
<DataGridTemplateColumn
Header=""{column.ColumnName}""
xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentControl Content=""{{Binding {column.ColumnName}}}"" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>";
XmlReader xr = XmlReader.Create(new StringReader(dataGridTemplateColumn));
dtgWatch.Columns.Add((DataGridTemplateColumn)System.Windows.Markup.XamlReader.Load(xr));
}
好的,我采用了不同的方法:
private void Dg_Loaded(object sender, RoutedEventArgs e)
{
for (int i = 0; i < dg.Items.Count; i++)
{
DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(i);
for (int j = 0; j < dg.Columns.Count; j++)
{
TextBlock cellContent = dg.Columns[j].GetCellContent(row) as TextBlock;
var strContent = cellContent.Text;
if (strContent == "BBB2")
{
// This if I want merely change the value (not my case)
//cellContent.Text = "XXXX";
//This if I want to put an image
var dtgCell = cellContent.Parent as DataGridCell;
dtgCell.Content = new Image() { Source = new BitmapImage(new Uri(@"C:UsersPicturesBall_Red.png")) };
}
}
}
}
因此,我尝试在显示dtg之前修改它,而在显示之后更改它。