2009-08-10 8 views
2

Je rencontre un problème avec le DataGrid où les propriétés de mon objet lié de données ne sont pas mis à jour lors de l'utilisation du CellTemplate/CellEditingTemplate:Silverlight: Problème d'utilisation CellEditingTemplate

<data:DataGridTemplateColumn Header="Text"> 
    <data:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Text}" ></TextBlock> 
     </DataTemplate> 
    </data:DataGridTemplateColumn.CellTemplate> 
    <data:DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding Text, Mode=TwoWay}" /> 
     </DataTemplate> 
    </data:DataGridTemplateColumn.CellEditingTemplate> 
</data:DataGridTemplateColumn> 

Je lient à un code-gen » d entité via les services RIA. J'ai ajouté un gestionnaire d'événement à l'événement PropertyChanged et il n'est jamais déclenché. Toutefois, si je n'utilise pas un modèle et utilise à la place un DataGridTextColumn, tout fonctionne correctement.

Je suis sûr que cela ressemble à une solution facile - je n'utilise qu'un TextBox dans mon modèle d'édition, alors pourquoi pas nous un DataGridTextColumn? Le problème est que je veux avoir une zone de texte multiligne, donc l'utilisation de DataGridTextColumn n'est pas une option.

Des suggestions? Connaissez-vous des différences entre l'utilisation d'un CellEditingTemplate contenant un seul TextBox et l'utilisation d'un DataGridTextColumn?

Merci,
-Charles

[UPDATE]
j'ai posté un rapport de bogue ici:
http://silverlight.net/forums/p/118729/267521.aspx

Je ne peux pas imaginer que ce soit "comme conçu" .. Si quelqu'un d'autre a su à ce sujet et que je suis juste stupide, j'apprécierais une explication - je préférerais l'embarras par ignorance :).

+0

+1: J'ai eu les mêmes problèmes. –

+0

S'il vous plaît laissez-moi savoir si vous trouvez une solution. Cela commence à me rendre fou. Je m'assurerai de mettre à jour ceci si je trouve une solution. – Charles

+0

Eh bien, j'ai trouvé une solution ... – Charles

Répondre

0

J'ai trouvé une solution, mais je ne peux pas expliquer pourquoi cela fait une différence:

Modifier cette ...

<data:DataGridTemplateColumn Header="Text"> 
    <data:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Text}" ></TextBlock> 
     </DataTemplate> 
    </data:DataGridTemplateColumn.CellTemplate> 
    <data:DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding Text, Mode=TwoWay}" /> 
     </DataTemplate> 
    </data:DataGridTemplateColumn.CellEditingTemplate> 
</data:DataGridTemplateColumn> 

... à ceci:

<data:DataGridTemplateColumn Header="Text"> 
    <data:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Text, Mode=OneWay}" ></TextBlock> 
     </DataTemplate> 
    </data:DataGridTemplateColumn.CellTemplate> 
    <data:DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding Text, Mode=TwoWay}" /> 
     </DataTemplate> 
    </data:DataGridTemplateColumn.CellEditingTemplate> 
</data:DataGridTemplateColumn> 


Notez comment j'ai spécifié "Mode = OneWay" sur la liaison du TextBlock:

<TextBlock Text="{Binding Text, Mode=OneWay}" ></TextBlock> 


Je ne sais pas pourquoi cela devrait faire la différence. Même si le TextBlock a été défini sur TwoWay, pourquoi n'y aurait-il pas de modifications apportées à l'objet lié aux données?

Une explication serait grandement appréciée ... J'ai passé environ cinq heures à me cogner la tête contre mon clavier juste pour en arriver là, et j'aimerais savoir pourquoi j'ai fait cette erreur (en supposant que ce n'est pas un bug dans Silverlight).

Merci,
-Charles

+0

A en juger par le comportement que vous voyez, je dirais que les nœuds XML sont traités dans l'ordre et la signature ctor est déterminée une fois et mise en cache. –

0

i "suspect" le problème est avec les constructeurs par défaut de la propriété Text de la zone de texte.

Maintenant, la propriété Text est un dependecyproperty, lorsque vous appelez

<TextBlock Text="{Binding Text}" ></TextBlock> 

vous appelez en fait le constructeur de la propriété Text qui prend une seule valeur de chaîne, à son tour SL/WPF utilise la réflexion pour savoir quel constructeur est-ce, vous pouvez éviter cela en l'utilisant dans un style de paramètres nommés.

<TextBlock Text="{Binding Path=Text}" ></TextBlock> 

je pense que de ne pas spécifier le mode dans lequel il fait défaut un temps contraignant, c'est pourquoi ne marche pas OnPropertyChanged affecte la valeur, étant donné que la liaison se produit qu'une seule fois. qui ressemble un peu ci-dessous. Maintenant, la valeur par défaut pour une liaison de zone de texte est "OneWay", peut-être puisque son imbriqué dans un DataGrid, son comportement par défaut est différent. Peut-être que c'est en train de faire l'héritage de la propriété et en utilisant le mode de liaison de l'UI Control.

<TextBlock Text="{Binding Text, Mode=OneTime}" ></TextBlock> 

donc pourquoi lorsque vous spécifiez le mode de liaison comme si

<TextBlock Text="{Binding Text, Mode=OneWay}" ></TextBlock> 

cela fonctionne heureusement et facilement

Questions connexes