2017-03-09 1 views
1

Nous utilisons UWP avec Template10. Template10.ViewModelBase gère la notification de modification. Nous avons un CostTextBlock lié à ViewModel.Cost. En utilisant un convertisseur CostTextBlock mises à jour lorsque ViewModel.Cost mises à jour. Lorsque nous lions à une fonction, le rendu des coûts dans le format correct, mais ne met pas à jour. Dans le ViewModel, nous avons:UWP TextBlock ne se met pas à jour lorsqu'il est lié à la fonction

public class ViewModel : ViewModelBase 
{ 

    decimal? _Cost = default(decimal?); 
    public decimal? Cost 
    { 
     get 
     { 
      return _Cost; 
     } 
     set 
     { 
      if (value == 0) value = null; 
      Set(ref _Cost, value); 
     } 
    } 

Ailleurs dans le ViewModel nous mettons à jour Coût:

this.Cost = null; 

En App.xaml nous définissons le convertisseur:

<T10Converters:StringFormatConverter x:Key="PriceConverter" Format="{}{0:N2}"/> 

De l'avis:

Text="{x:Bind ViewModel.Cost,Mode=OneWay, Converter={StaticResource PriceConverter}}"/> 

Nous pouvons charger la vue avec une commande et le rendu des coûts est correct. En utilisant le convertisseur, lorsque Cost est défini sur null, la modification est reflétée dans la vue.

Nous avons aussi une méthode qui fait la même chose que le convertisseur:

public static string FormatPrice(decimal? price) 
{ 
    if (price == null) 
     return null; 
    return ((decimal)price).ToString("N2"); 
} 

Dans ce cas, le XAML dans la vue est

Text="{x:Bind Helpers:Globalisation.FormatPrice(ViewModel.Cost),Mode=OneWay}" 

Formate correctement le coût de la vue, mais le Le même code utilisé avec le convertisseur this.Cost = null; ne met pas à jour la vue même si le coût a été mis à jour. Pourquoi est-ce que CostTextBlock ne reflète pas les mises à jour de ViewModel.Cost lorsqu'il est lié à FormatPrice?

+0

Cela signifie-t-il que cela ne fonctionne pas uniquement lorsque le coût est * nul *? Que devrait-il se passer/être montré quand le coût est * null *? Ne devrait pas être la chaîne vide quand le coût est nul? – Romasz

+0

@Romasz Lorsque le coût est nul, la vue doit afficher le coût en blanc. C'est le cas lorsque nous utilisons le convertisseur. Lorsque je lier le contrôle à FormatPrice, Coût n'est pas mis à jour dans la vue. Si je change FormatPrice pour retourner String.Empty, cela ne fait aucune différence. Le coût ne se met toujours pas à jour dans la vue. – Vague

+0

ne serait-il pas mieux de retourner 0.0 sur le cas nul? Deuxièmement, regardez comment le convertisseur est mis en œuvre, il pourrait vous éclairer comme la raison pour laquelle le cas de null fonctionne avec le convertisseur par rapport à la méthode statique. – mvermef

Répondre

0

Ce problème est survenu dans quelques propriétés qui ont été mises à jour à partir du viewmodel. J'ai réussi à contourner ce problème en utilisant

ViewModelBase est destiné à gérer la notification de modification et il semble le faire dans tous les cas où les contrôles sont liés aux propriétés. Si quelqu'un peut trouver une meilleure solution ou une explication de la raison pour laquelle la notification de changement ne se déclenche pas dans les quelques cas où les contrôles sont liés à des fonctions, je les marquerai volontiers comme réponse.

+0

Procédez-vous à une transformation dans les setters comme dans votre exemple 'if (value == 0) value = null;'? Tout simplement parce que la méthode 'Set' ne déclenche que' PropertyChanged' si le champ et la valeur ne sont pas égaux. –

+0

C'est vrai @ Tóth Tibor.if (value!= _Cost) { if (value == 0) value = null; – Vague