C#WPF-将图像添加到数据集或数据网格-仅代码隐藏



我有一个数据网格,它在的开头定义

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之前修改它,而在显示之后更改它。

最新更新