I have a DataGrid and the columns and rows are added in the code behind.
MainWindow.xaml:
<DataGrid Name="dgResult" ItemsSource="{Binding}" AutoGenerateColumns="True" CanUserAddRows="False" ColumnWidth="*"/>
MainWindow.xaml.cs:
private void AddItemsToDataGrid()
{
List<Measurement> measurements = new List<Measurement>()
{
new Measurement(){ Address="1", Pressure="10", ErrorTemps=new List<ErrorTemp>()
{
new ErrorTemp(){Temp="10", Error="0.1", IsErrorOK =true}, new ErrorTemp() { Temp = "20", Error = "0.2", IsErrorOK =true }}
},
new Measurement(){ Address="1", Pressure="20", ErrorTemps=new List<ErrorTemp>()
{
new ErrorTemp(){Temp="10", Error="0.2", IsErrorOK =true}, new ErrorTemp() { Temp = "20", Error = "0.3", IsErrorOK =true }}
},
new Measurement(){ Address="1", Pressure="30", ErrorTemps=new List<ErrorTemp>()
{
new ErrorTemp(){Temp="10", Error="0.34", IsErrorOK =true}, new ErrorTemp() { Temp = "20", Error = "0.5", IsErrorOK =false }}
}
};
DataTable dataTable = new DataTable();
dataTable.Columns.Add(nameof(Measurement.Address));
dataTable.Columns.Add(nameof(Measurement.Pressure));
foreach(ErrorTemp error in measurements[0].ErrorTemps)
dataTable.Columns.Add(nameof(error.Error)+"("+error.Temp +")");
List<string> row;
foreach (Measurement measurement in measurements)
{
row = new List<string>() { measurement.Address, measurement.Pressure };
foreach (ErrorTemp error in measurement.ErrorTemps)
row.Add(error.Error);
dataTable.Rows.Add(row.ToArray());
}
dgResult.ItemsSource = dataTable.DefaultView;//bez default view jest źle
}
Measurement.cs:
namespace DataGridCodeBehind
{
public class Measurement
{
public string Address { get; set; }
public string Pressure { get; set; }
public List<ErrorTemp> ErrorTemps { get; set; }
}
public class ErrorTemp
{
public string Temp { get; set; }
public string Error { get; set; }
public bool IsErrorOK { get; set; }
}
}
I want to change the cell background color depending on IsErrorOK
value. How can I do it in the code behind?
Second solution works fine if I generate Measurments in MainViewModel constructor:
public MainViewModel()
{
OpenCommand = new DelegateCommand(OpenHandler);
GenerateList();
}
But if I will insert button, after pressing it I select text files and generate Measurements. I use button Command to do it.:
MainViewModel.cs:
public class MainViewModel : BindableBase
{
public ObservableCollection<Measurement> Measurements { get; set; } //= new ObservableCollection<Measurement>();
public DelegateCommand OpenCommand { get; set; }
public MainViewModel()
{
OpenCommand = new DelegateCommand(OpenHandler);
}
private void OpenHandler()
{
GenerateList();
}
private void GenerateList()
{
Measurements = new ObservableCollection<Measurement>()
{
new Measurement(){ Address="1", Pressure="10", ErrorTemps=new List<ErrorTemp>()
{
new ErrorTemp(){Temp="10", Error="0.1", IsErrorOK =true}, new ErrorTemp() { Temp = "20", Error = "0.2", IsErrorOK =true }, new ErrorTemp() { Temp = "30", Error = "0.41", IsErrorOK =true }}
},
new Measurement(){ Address="1", Pressure="20", ErrorTemps=new List<ErrorTemp>()
{
new ErrorTemp(){Temp="10", Error="0.2", IsErrorOK =true}, new ErrorTemp() { Temp = "20", Error = "0.3", IsErrorOK =true }, new ErrorTemp() { Temp = "30", Error = "0.42", IsErrorOK =true }}
},
new Measurement(){ Address="1", Pressure="30", ErrorTemps=new List<ErrorTemp>()
{
new ErrorTemp(){Temp="10", Error="0.34", IsErrorOK =true}, new ErrorTemp() { Temp = "20", Error = "0.5", IsErrorOK =false }, new ErrorTemp() { Temp = "30", Error = "0.43", IsErrorOK =false }}
}
};
}
In the above example, I simplified code and generate Measurmenst list without selecting files. Now I have empty DataGrid. How to solve that?