- Подскажите как изменить значение Source="img/Best/1.png" для ячейки DataGrid на которую нажал, кликом , клавишей, любым вариантом.
- Как связать и значение в ячейке DataGrid взятое с DataTables . Пробивал разные варианты, ничего не вышло, сложный wpf для новичка. Очень нравиться кодить, но тут я застрял на 5 дней.
Суть программы для составления схем для вязания:
Будет "список картинок" и DataGrid, привязная к DataTable. Выбираем картинку (Условное обозначение) и при клике на клетку , нужно присвоить путь картинки в элемент Image, (как бы, рисовать картинкой по клетках).

На сайт MSDN не отправлять, я там постоянно. Как я понял, на WPF так не получиться, возвращаюсь к Windows Forms .
Код XAML:
<Window.Resources>
<viewModel:DataRowViewConverter x:Key="drvc" />
<DataTemplate x:Key="ATemplate">
<Image Source="img/Best/1.png"></Image>
</DataTemplate>
<DataTemplate x:Key="BTemplate">
<CheckBox ... />
</DataTemplate>
</Window.Resources>
cs Код:
DataGrid MyGrid = new DataGrid();
System.Data.DataTable dt = new System.Data.DataTable();
dt.Columns.Add("Col1", typeof(string));
dt.Columns.Add("Col2", typeof(string));
dt.Rows.Add("test", "img/Best/1.png", "img/Best/1.png", "img/Best/1.png");
dt.Rows.Add("TestString");
Items = dt;
this.DataContext = this;
private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
DataTemplate dt = null;
if (e.PropertyType == typeof(string))
dt = (DataTemplate)Resources["ATemplate"];
else if (e.PropertyType == typeof(B))
dt = (DataTemplate)Resources["BTemplate"];
if (dt != null)
{
DataGridTemplateColumn c = new DataGridTemplateColumn()
{
CellTemplate = dt,
Header = e.Column.Header,
HeaderTemplate = e.Column.HeaderTemplate,
HeaderStringFormat = e.Column.HeaderStringFormat,
SortMemberPath = e.PropertyName // this is used to index into the DataRowView so it MUST be the property's name (for this implementation anyways)
};
e.Column = c;
}
}
public class DataRowViewConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
DataGridCell cell = value as DataGridCell;
if (cell == null)
return null;
System.Data.DataRowView drv = cell.DataContext as System.Data.DataRowView;
if (drv == null)
return null;
return drv.Row[cell.Column.SortMemberPath];
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
DataTable+DataGrid. – aepot Apr 30 '20 at 19:36DataTable, ну только если вы не работаете напрямую с SQL. Вместо этого создать класс для данных, и использовать свойство типаObservableCollection<MyClass>, и к нему уже привязывать табличку, примерно так, но можно еще сотню подобных примеров найти. Попытайтесь разобраться с MVVM, хотя-бы базово, и WPF станет значительно проще в освоении. – aepot Apr 30 '20 at 19:44DataGrid, этот контрол сам по себе не простой и в первую очередь предназначен для редактирования данных прямо в интерфейсе. Вам ведь надо просто отображать? Вот примеры сListView: раз и два – aepot Apr 30 '20 at 19:52DataGridиз обработчиков событий лет 5 назад. А потом узнал про MVVM иBinding, и понял, что все это время я "ходил пешком", а можно было "нормально ездить". Вы уже знакомы сDataContext, почитайте примеры по ссылкам выше, разберите их, решение само придёт в голову, оно простое. – aepot Apr 30 '20 at 20:21