2010-09-10 4 views
0

J'ai créé une grille de données avec des colonnes liées à une collection observable. Tout fonctionne bien, sauf pour une colonne qui est liée à une propriété décimale nullable de mon objet métier.Problème de liaison de colonne Wpf 4 DataGrid

Si je

<DataGridTextColumn Binding="{Binding Path=BaseUnitCostValue}" Header="Unit Cost Value" MinWidth="100" /> 

que ma définition de la colonne tout fonctionne bien, cependant, que je veux finalement que ce soit une colonne complexe que j'ai essayé d'utiliser un DataGridTemplateColumn tel que

<DataGridTemplateColumn Header="Unit Cost Value" MinWidth="100"> 
    <DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding BaseUnitCostValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellEditingTemplate> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding BaseUnitCostValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" TextAlignment="Right"/> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

Cependant , en utilisant cette configuration de colonne, bien que je puisse entrer une valeur dès que je termine l'édition de la cellule, sa valeur disparaît.

J'ai également essayé d'utiliser des convertisseurs pour convertir en chaîne et revenir à un nombre décimal NULL mais sans succès.

Je soupçonne fortement que cela soit dû au fait qu'il est lié à une valeur décimale nulle. Y at-il quelque chose de plus que je dois faire à mon cellTemplates afin que la valeur se lie correctement, de la même manière est le cas lors de l'utilisation d'un DataGridTextColumn standard?

Merci

+0

liez-vous le DataGrid dans le code? Si oui, avec quelle source? – Neutralizer

Répondre

1

Peut-être parce que vous essayez de faire un double sens contraignant pour le TextBlock dans le modèle non edit:

<DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding BaseUnitCostValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" TextAlignment="Right"/> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 

Essayez de changer à sens unique, peut elle fonctionne alors. Supprimez également l'instruction Trigger.

Si cela ne vous aide pas, regardez dans la fenêtre de sortie si vous voyez un message similaire.

+0

Malheureusement, supprimer le mode = TwoWay et UpdateSourceTrigger = PropertyChanged du bloc de texte ne fait aucune différence – user360349

+0

Et vous n'avez pas de message associé dans la fenêtre de sortie? – HCL

+0

a) Essayez ce qui se passe si vous déclarez TextBox comme modèle par défaut et que vous ne déclarez pas le modèle d'édition. b) Créer et attacher un convertisseur de valeur qui ne fait rien que renvoyer les valeurs d'entrée. Définissez un point d'arrêt dans le convertisseur pour voir ce qui se passe. – HCL

0

C'était un problème dans mon modèle économique.

je devais changer ma propriété de

Public Property BaseUnitCostValue As Decimal? 
     Get 
      Return _BaseUnitCostValue 
     End Get 
     Set(ByVal value As Decimal?) 
      If _BaseUnitCostValue <> value Then 
       _BaseUnitCostValue = value 
       Me.DataStateChanged("BaseUnitCostValue") 
       Me.DataStateChanged("TotalBaseUnitCostValue") 
      End If 

     End Set 
    End Property 

Pour

Public Property BaseUnitCostValue As Decimal? 
     Get 
      Return _BaseUnitCostValue 
     End Get 
     Set(ByVal value As Decimal?) 
      If (Not _BaseUnitCostValue.HasValue) OrElse (Not value.HasValue) OrElse _BaseUnitCostValue <> value Then 
       _BaseUnitCostValue = value 
       Me.DataStateChanged("BaseUnitCostValue") 
       Me.DataStateChanged("TotalBaseUnitCostValue") 
      End If 

     End Set 
    End Property 

Et le problème a disparu. Merci à HCL comme l'idée du point de rupture dans un convertisseur simple m'a montré que la propriété n'a jamais été réellement mise à jour.

Questions connexes