C#WPF-将图像添加到数据集或数据网格-仅背后提供代码

时间:2018-11-30 15:13:10

标签: c# wpf image datagrid dataset

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

 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


感谢您的帮助

帕特里克

2 个答案:

答案 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,而在之后进行更改。