Hello,
I have following problem with XamGrid:I want to use conditional formatting of cells with StyleScope="Row", according to a value of a cell in XamGrid should be changed the foreground colour (red) of the whole row. I set the "conditional" column to values in order to set foreground colour in whole XamGrid to red. Everything was OK, until conditional formatting changed the style of visible rows. When I scrolled to see other rows, I was surprised, because some of them were red, some of them were not. When I scrolled to the beginning to see the first rows, theyhad the same problem! Other thing is, that it behaved indeterminately - for example I had 5 visible rows in XamGrid, but I had 7 rows in the whole grid. So I had to scroll to seethe 6. and 7. row, but sometimes the 6. row had the style not set, sometimes the 7. has the same problem, but the 6. was set.
After these troubles I tried to set foreground colour "directly" in code in this way:
Brush BlackForegroundBrush = new SolidColorBrush(Color.FromArgb(0xFF, 0, 0, 0));Brush RedForegroundBrush = new SolidColorBrush(Color.FromArgb(0xFF, 0xFF, 0, 0));Brush brush;
foreach (Row row in grid.Rows){ VxSJEmisia emisia = row.Data as VxSJEmisia; if (emisia != null) { if (emisia.Valid) { brush = BlackForegroundBrush; } else { brush = RedForegroundBrush; }
foreach (Cell cell in row.Cells) { if (cell != null && cell.Control != null) { cell.Control.Foreground = brush; } } }}
But the XamGrid had the same behavior.Surprisingly in some cases the cell.Control has null value in existing XamGrid !
Please, could somebody help me with this? Thanks a lot.
You shouldn't scroll through all the rows and look at the controls in that manner because the cell control is virtualized and only attached to a cell if the cell is in view. So if your row is off screen, the cell.Control would be null.
What is the version number of the dll that you are using? I recall there was bug with StyleScope.Row but I think it was resolved a while ago and in the Service Release.
I am attaching a demo project showing how I tested it. If you can modify this project to show the behavior, or have a simple project that shows the behavior, you can attach it here so we can look at what might be causing your issue.
Hello,I have added into your project some code to show how it works. Function Button_Click changes IDMod4 of a Person from 3 to 2 in order to change the style of rows.If you click the button "Change IDMod4", rows with ID 7,11,19,23, and so on... should be changed, but nothing happens unless you scroll down and back. I have tried to use StyleScope="Cell", the behavior is the same.I suppose, there is a refresh problem, do I have to use some refreshing functionality of XamGrid?
I am using dlls from .NET Advantage 2010.3, the exact version of InfragisticsSL4.Controls.Grids.XamGrid.v10.3.dll is: 10.3.20103.1006 .
Thanks.
There have been multiple Service Releases since the release of 10.3, (we aim for about 1 per month) so it might be something that has been resolved already.
You should check you https://es.infragistics.com/Membership/Default.aspx?panel=Downloads#Downloads for the latest SR.
So you are changing values and you want the style to reflect that.
First you need to set the rule to update the conditional formatting rule designation to update on data change
<ig:EqualToConditionalFormatRule StyleScope="Cell" Value="2"
StyleToApply="{StaticResource RedStyle}" ShouldRefreshOnDataChange="true"
></ig:EqualToConditionalFormatRule>
And the data object wasn't robust enough to show how that could be done. It was only intended to check
the setting of StyleScope.
So if you want the grid to respond to data changes then the data object needs to implement
INotifyPropertyChanged.
public class Person : INotifyPropertyChanged { public int ID { get; set; } public string Name { get; set; } public int IDMod4 { get { return this._idMod4; } set { if (this._idMod4 != value) { this._idMod4 = value; this.OnNotifyPropertyChanged("IDMod4"); } } } private int _idMod4; protected virtual void OnNotifyPropertyChanged(string propName) { if (this.PropertyChanged != null) { this.PropertyChanged(this, new PropertyChangedEventArgs(propName)); } } #region INotifyPropertyChanged Members public event PropertyChangedEventHandler PropertyChanged; #endregion } If you don't implement this interface then the grid cannot know that changes happened to the underlying data.
public class Person : INotifyPropertyChanged { public int ID { get; set; } public string Name { get; set; } public int IDMod4 { get { return this._idMod4; } set { if (this._idMod4 != value) { this._idMod4 = value; this.OnNotifyPropertyChanged("IDMod4"); } } } private int _idMod4; protected virtual void OnNotifyPropertyChanged(string propName) { if (this.PropertyChanged != null) { this.PropertyChanged(this, new PropertyChangedEventArgs(propName)); } } #region INotifyPropertyChanged Members public event PropertyChangedEventHandler PropertyChanged; #endregion }
If you don't implement this interface then the grid cannot know that changes happened to the
underlying data.
I have tried your solution, and it works fine (even without Service Release).
Thanks a lot.