2013-04-23 4 views
0

Я ищу способ, которым я могу добавить столбец, который показывает изображения, в datagrid программно. Я искал, как найти решение в течение длительного времени без успеха.Datagrid image column add programatically wpf

То, как я делаю это сейчас, как это:

DataGridTemplateColumn col1 = new DataGridTemplateColumn(); 
col1.Header = "Betaald"; 
FrameworkElementFactory factory1 = new FrameworkElementFactory(typeof(System.Windows.Controls.Image)); 
Binding b1 = new Binding("Picture") { Mode = BindingMode.TwoWay }; 
factory1.SetBinding(System.Windows.Controls.Image.SourceProperty, b1); 
DataTemplate cellTemplate1 = new DataTemplate(); 
cellTemplate1.VisualTree = factory1; 
col1.CellTemplate = cellTemplate1; 
dtgVerkoopsdocumenten.Columns.Add(col1); 

Это должно создать столбец, где я могу показать изображения. Все данные, которые я получаю от базы данных, которые я храню в colums, как это:

System.Windows.Controls.Image image = new System.Windows.Controls.Image(); //this is on top of my class 

MySqlDataReader reader = cmd.ExecuteReader(); 
while (reader.Read()) 
{ 
    string naam = getKlant(reader.GetInt32(2)); 

    if (reader.GetBoolean(7) == false) 
    { 
     BitmapImage betalen = new BitmapImage(new Uri("/WpfApplication1;component/Images/false.png", UriKind.Relative)); 
     image.Source = betalen; 
    } 
    else 
    { 
     BitmapImage betalen = new BitmapImage(new Uri("/WpfApplication1;component/Images/true.png", UriKind.Relative)); 
     image.Source = betalen; 
    } 

    dtgVerkoopsdocumenten.Items.Add(new DataItem 
    { 
     ID = reader.GetInt32(1), 
     klant = naam, 
     netto = reader.GetDouble(3), 
     btw = reader.GetDouble(4), 
     bruto = reader.GetDouble(5), 
     datum = reader.GetDateTime(6).ToString("dd-MM-yyyy"), 
     soort2 = soort, 
     Picture = image 
     }); 
    } 
    reader.Close(); 

DataItem является собственным из класса, где я храню во всех моих привязок:

//more code, but the one below is the one I'm talking about 
public System.Windows.Controls.Image Picture { get; set; } 

Что я получить сейчас абсолютно ничего. Однако я не ошибаюсь.

Итак, мой вопрос: как я могу сохранить изображение в datagrid без необходимости слишком много обходиться с файлом xaml.

Выход:

System.Windows.Data Error: 1 : Cannot create default converter to perform 'two-way' conversions between types 'System.Windows.Controls.Image' and 'System.Windows.Media.ImageSource'. Consider using Converter property of Binding. BindingExpression:Path=Picture; DataItem='DataItem' (HashCode=435249); target element is 'Image' (Name=''); target property is 'Source' (type 'ImageSource') 
System.Windows.Data Error: 5 : Value produced by BindingExpression is not valid for target property.; Value='System.Windows.Controls.Image' BindingExpression:Path=Picture; DataItem='DataItem' (HashCode=435249); target element is 'Image' (Name=''); target property is 'Source' (type 'ImageSource') 
System.Windows.Data Error: 1 : Cannot create default converter to perform 'two-way' conversions between types 'System.Windows.Controls.Image' and 'System.Windows.Media.ImageSource'. Consider using Converter property of Binding. BindingExpression:Path=Picture; DataItem='DataItem' (HashCode=45279885); target element is 'Image' (Name=''); target property is 'Source' (type 'ImageSource') 
System.Windows.Data Error: 5 : Value produced by BindingExpression is not valid for target property.; Value='System.Windows.Controls.Image' BindingExpression:Path=Picture; DataItem='DataItem' (HashCode=45279885); target element is 'Image' (Name=''); target property is 'Source' (type 'ImageSource') 
+0

ли вам это нужно как Binding режиме 2-Way? Если нет, замените его на односторонний. –

+0

Я пробовал это, и единственное, что меняется, - это «двусторонний», «односторонний» в окне вывода. –

+0

Посмотрите на [этот ответ] (http://stackoverflow.com/a/3427387/1466627), который исправляет ошибку Image to ImageSource. –

ответ

0

Вы должны использовать метод SetBinding вместо SetValue, так как вы назначаете привязки к свойству, не присвоить значение свойству.

От:

factory1.SetValue(System.Windows.Controls.Image.SourceProperty, b1); 

To:

factory1.SetBinding(System.Windows.Controls.Image.SourceProperty, b1); 

Ваше связывании заявление также может быть записана в виде:

Binding b1 = new Binding("Picture") { Mode = BindingMode.TwoWay }; 
+0

Я все еще ничего не получаю в своем datagrid. –

+0

@RobbeVanWinckel Ничего в окне вывода? –

+0

Проверьте главный пост, чтобы увидеть результат. –