2017-09-14 8 views
1

Existe-t-il un moyen de lier un decimal à une zone de texte WPF et de spécifier un StringFormat (dans ce cas la devise)? Je l'ai essayé de faire cela avec une propriété dans la vue Modèle, mais le montage dans la zone de texte devient un peu bizarre car il tente d'appliquer la mise en forme après chaque combinaison de touches:Lier la zone de texte avec ReactiveUI et maintenir le format de la devise

public string Moneys 
{ 
    get 
    { 
     return string.Format("{0:C}", Model.Moneys); 
    } 

    set 
    { 
     if (decimal.TryParse(value, NumberStyles.Currency, null, out decimal decimalValue)) 
     { 
      Model.Moneys = decimalValue; 
     } 
    } 
} 

J'ai essayé le réglage de la DataContext et utilisé les données Xaml contraignant à la place. XAML:

<TextBox Text="{Binding Path=Moneys, StringFormat=C0}" /> 

code derrière:

this.WhenAnyValue(x => x.ViewModel.Model) 
    .Subscribe(x => 
    { 
     DataContext = x; 
    }); 

Cependant, après avoir changé DataContext l'{Binding} ne change pas comme je l'avais prévu à.

Existe-t-il un moyen d'utiliser this.Bind et de spécifier le StringFormat? pour moi, ce serait la solution idéale

MISE À JOUR

Dans le cas de réglage du DataContext, je réalisais que je devrais être assignons à la ViewModel et quand ViewModel.Model changements, le modèle reflète les changements Comme il se doit. Voici mon XAML mise à jour:

<TextBox Text="{Binding Path=Model.Moneys, StringFormat=C0}" /> 

Cependant, je voudrais encore savoir si vous pouvez définir le StringFormat dans le code derrière l'utilisation ReactiveUI.

Répondre

1

Vous pouvez utiliser une ligne de liaison Converter, faire la liaison dans le code derrière (votre TextBox besoin d'un nom):

this.Bind(
    ViewModel, 
    x => x.ViewModel.Model.Moneys, 
    x => x.nameOfTheTextbox, 
    x => ConvertToText(x), 
    x => ConvertToDec(x)); 

Et les méthodes:

private string ConvertToText(decimal value) 
{ 
    return string.Format("{0:C}", value); 
} 

private decimal ConvertToDec(string value) 
{ 
    decimal result; 
    if (!decimal.TryParse(value, NumberStyles.Currency, null, out result))  
    { 
     result = 0; 
    } 
    return result 
}