En utilisant le DataGrid WPF j'ai besoin de changer diverses propriétés d'affichage et connexes d'un DataGridCell - tels que Foreground, FontStyle, IsEnabled et ainsi de suite - basé sur la valeur pertinente de la propriété de l'objet de la cellule.Liaison d'une propriété d'objet de cellule à un DataGridCell dans WPF DataGrid
Maintenant, c'est facile à faire dans le code, par exemple (en utilisant une collection Observable de ObservableDictionaries):
var b = new Binding("IsLocked") { Source = row[column], Converter = new BoolToFontStyleConverter() };
cell.SetBinding(Control.FontStyleProperty, b);
et fonctionne très bien, mais je ne vois pas comment faire en XAML depuis que je ne trouve pas façon de définir Chemin à la propriété d'un objet de cellule.
Une tentative XAML est:
<Setter Property="FontStyle">
<Setter.Value>
<MultiBinding Converter="{StaticResource IsLockedToFontStyleConverter}" Mode="OneWay" UpdateSourceTrigger="PropertyChanged">
<Binding />
<Binding RelativeSource="{x:Static RelativeSource.Self}"/>
</MultiBinding>
</Setter.Value>
</Setter>
mais il n'y a pas de liaison à la IsLocked propriété
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var row = (RowViewModel) values[0];
var cell = (DataGridCell) values[1];
if (cell != null && row != null)
{
var column = DataGridMethods.GetColumn(cell);
return row[column].IsLocked ? "Italic" : "Normal";
}
return DependencyProperty.UnsetValue;
}
S'il vous plaît noter qu'une version précédente est revenu ligne [col] .IsLocked et définir le FontStyle en utilisant un DataTrigger mais un objet retourné n'est pas databound.
Notez, bien entendu, que l'application ne sait pas ce que sont les colonnes au moment du design. Enfin, DataTable est beaucoup trop inefficace pour mes besoins mais je serais intéressé de voir comment cela se fait avec DataTables de toute façon, si une telle solution existe pour eux, cela pourrait être utile ailleurs (bien que je préfère utiliser des collections).
Sûrement c'est un problème commun et je suis un noobie de WPF essayant d'aller tout MVVM sur mon projet, mais ce problème me retient en ce qui concerne l'utilisation du DataGrid de WPF.
merci pour le partage. C'est très moche, mais c'est aussi de loin la solution la plus simple que j'ai vu jusqu'ici pour ce problème ... – David
Je réalise que c'est un vieux post mais j'ai trouvé que je peux simplement mettre 'row row [column];' dans le bloc if .. et ça marche. Que fait le code ci-dessus différemment (c'est-à-dire créer une liaison)? –
La liaison ne se produit pas sauf dans le convertisseur. Si vous ne liez pas dans le convertisseur et ne renvoyez que la ligne [column], puis mettez à jour la cellule référencée, elle n'est pas liée et vous ne voyez aucune mise à jour dans le DataGrid. J'ai une solution beaucoup mieux et non hacky, bien que le XAML soit plus compliqué. Je vais l'ajouter ici quand j'ai le temps. – Martino