0

Добрый деньУстановочное значение ячейки datagridtextcolumn Приложение WPF

Должно быть, мне не хватает чего-то действительно простого; У меня есть datagrid с двумя столбцами combobox и datagridtextcolumn. После того, как пользователь выбрал значение для обоих этих списков (значение от 1 до 5), вычисление выполняется с этими двумя значениями (в событии с измененной функцией выбора). Мне нужно записать результат вычисления в ячейку (datagridtextcolumn) и изменить фон этой ячейки на определенный цвет на основе значения. Мне удалось найти значения в comboboxes и индекс текущей строки, но доступ к соответствующей ячейке для записи результата к лучшему мне ...

Вот код для обработчика событий, который называет расчет до сих пор:

private void cmbConseq_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    var cellInfos = dgDeviation.SelectedCells; 
    if (cellInfos == null) 
    { 
     return; 
    } 
    var content = cellInfos[0].Column.GetCellContent(cellInfos[0].Item); 
    DataRowView row = (DataRowView)content.DataContext;//get the datacontext from FrameworkElement and typecast to DataRowView 
    object[] obj = row.Row.ItemArray;//ItemArray returns an object array with single element 
    int likely = Convert.ToInt16(obj[0]); 
    int cons = Convert.ToInt16(obj[1]); 
    int riskValue = new Calculations().riskRankingCalc(likely, cons); 

    int rowIndex = dgDeviation.Items.IndexOf(dgDeviation.CurrentItem); 

Как я пишу переменную «riskValue» в соответствующей ячейке в выбранной строке в EventHandler?

+1

привяжите свой DataGrid к ViewModel и сохраните ** много ** времени – ASh

+0

Спасибо за предложение, но я не использую MVVM или любой другой такой шаблон. Это приложение просто пишет в базу данных, очень прямолинейно. Я знаю, что это не очень хорошая практика, но считалось, что использование шаблона MVVM будет излишним из-за жестких сроков. – BabyDoll

ответ

1

После недолгих экспериментов и помощи со стороны других SO вопросов, решение, которое работало для меня было реализовать следующие два вспомогательных методов:

public static T GetVisualChild<T>(Visual parent) where T : Visual 
    { 
     T child = default(T); 
     int numVisuals = VisualTreeHelper.GetChildrenCount(parent); 
     for (int i = 0; i < numVisuals; i++) 
     { 
      Visual v = (Visual)VisualTreeHelper.GetChild(parent, i); 
      child = v as T; 
      if (child == null) 
      { 
       child = GetVisualChild<T>(v); 
      } 
      if (child != null) 
      { 
       break; 
      } 
     } 
     return child; 
    } 

    public static DataGridCell GetCell(DataGrid grid, int column) 
    { 
     DataGridRow row = grid.ItemContainerGenerator.ContainerFromIndex(grid.SelectedIndex) as DataGridRow; 

     if (row != null) 
     { 
      DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(row); 

      if (presenter == null) 
      { 
       grid.ScrollIntoView(row, grid.Columns[column]); 
       presenter = GetVisualChild<DataGridCellsPresenter>(row); 
      } 

      DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column); 
      return cell; 
     } 
     return null; 
    } 

И затем, чтобы сделать изменения в клетке, как легко как вызов: GetCell (myDatagrid, columnIndex) .Content = «Новое значение»;