我有一个在开头定义的数据网格
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 |
| string1_B | Image2_B | <---------------
| string1_B | string2_C |
从理论上讲,这应该可以工作(没有编译错误),因为如果是图片,我将添加带有
的行Image img =...
dtsWatch.Tables[0].Rows.Add(string1, img);
但结果是
|字符串1 | System.Windows.Controls.Image |
我想到的一种可能的解决方案是将标记放在某个地方,然后在运行时(加载行事件或类似的事件)更改带有图像的单元格的内容。不幸的是,我可以这样做,因为我可以直接访问和修改单元格。
我正在使用带有appdomain tecnique的C#wpf进行所有操作。这意味着我还没有xaml,我必须在代码背后做所有事情。我所拥有的只是一个要与datagrid添加的网格。
我尝试过that,但是还没有完成,我发现的所有其他解决方案都暗示要使用xaml
感谢您的帮助
帕特里克
答案 0 :(得分:1)
要实现所需的行为,您必须手动创建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));
}
答案 1 :(得分:1)
好的,我采用了另一种方法:
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:\Users\Pictures\Ball_Red.png")) };
}
}
}
}
因此,我尝试在显示之前修改dtg,而在之后进行更改。