Question

J'ai un DataGrid avec des colonnes générées dynamiquement et je dois changer le style des cellules dont les valeurs ont changé après quelques manipulations.

Le ItemsSource pour DataGrid est défini comme List<MyTableRow>, où

public class MyTableRow
{
    private string[] _values;
    private string _rowHeader;

    // getters and setters here
}

Les colonnes DataGrid sont générées avec le code suivant :

for (int i = 0; i < source[0].Values.Length; i++)
{
    var col = new DataGridTextColumn();
    var binding = new Binding("Values[" + i + "]");
    col.Binding = binding;
    col.CanUserSort = false;
    this.dataGrid.Columns.Add(col);
    this.dataGrid.Columns[i].Header = columnNames[i];
}

Le DataGrid résultant ressemble à ce

Le problème survient lorsque j'essaie de mettre en évidence (texte en gras ou arrière-plan coloré) des cellules dont les valeurs dans ItemsSource ont changé.C'est là que ma question se divise en deux :

  1. Existe-t-il un moyen « intégré » de faire quelque chose avec des cellules modifiées ?(peut-être avec ObservableColletion ou autre chose)
  2. Si non, comment puis-je mettre en évidence des cellules distinctes en fonction de leurs index ou de leurs valeurs ?

J'ai essayé de le faire avec des styles et/ou des déclencheurs Xaml, mais il s'est avéré que je ne sais pas quelle valeur aveuglante dois-je transmettre au convertisseur.

<Style TargetType="TextBlock">
    <Setter Property="Background" 
            Value="{Binding <!-- some proper binding here -->, 
                    Converter={StaticResource ValueToBrushConverter}}"/>
</Style>

D'autres solutions trouvées sur SO ont le même "problème" de liaison ou ne fonctionnent tout simplement pas.Que puis-je faire pour mettre en évidence simplement un cellule et pas une ligne/colonne entière ?Je peux changer ItemsSource, MyTableRow code de génération des champs et/ou colonnes, si nécessaire

Est-ce que quelqu'un peut m'aider s'il vous plait?Cela fait quelques jours que je suis confronté à ce problème


MISE À JOUR Solution trouvée


Était-ce utile?

La solution

Découvrez enfin comment faire ce que je veux.La solution est un peu "sale", mais fonctionne bien pour moi.J'ai ajouté un espace insécable à chaque cellule que je dois mettre en évidence

private const string NBSP = "\u00A0"

Il ne reste plus qu'à créer un convertisseur de valeur.J'ai donc ajouté MultiBinding dans mon XAML :

<DataGrid.CellStyle>
    <Style TargetType="{x:Type DataGridCell}">
        <Setter Property="Background">
            <Setter.Value>
                <MultiBinding Converter="{StaticResource ValueToBrushMultiConverter}" >
                    <MultiBinding.Bindings>
                        <Binding RelativeSource="{RelativeSource Self}" />
                        <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRow}}" />
                    </MultiBinding.Bindings>
                 </MultiBinding
            </Setter.Value>
        </Setter>
    </Style>
</DataGrid.CellStyle>

Сonvertisseur défini comme :

public class ValueToBrushMultiConverter : IMultiValueConverter
    {
        private const string NBSP = "\u00A0";
        public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            var cell = (DataGridCell)values[0];
            var dgRow = (DataGridRow)values[1];

            var test = (dgRow.Item as TableRow<string, string>).Values[cell.Column.DisplayIndex];

            if (test.Contains(NBSP))
                return System.Windows.Media.Brushes.PaleGreen;
            return DependencyProperty.UnsetValue;           
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotSupportedException();
        }
    }

J'espère que cela aide quelqu'un !

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top