2017-09-14 14 views
1

decimalをWPF TextBoxにバインドし、StringFormat(この場合は通貨)を指定する方法はありますか?私は、ビューモデル内のプロパティでこれをやって試してみたが、それはすべてのキーストロークの後に書式を適用しようとするテキストボックスでの編集は少し風変わりな次のようになります。ReactiveUIを使用してテキストボックスをバインドし、通貨形式を維持する

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; 
     } 
    } 
} 

私はDataContextを設定しようとしたとXAMLデータを使用しました代わりにバインドします。 XAML:背後

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

コード:私はに期待したいと

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

しかし、DataContext{Binding}を変更した後に変更されません。

this.Bindを使用してStringFormatを指定する方法はありますか?私にとって、それはDataContextを設定する場合には理想的なソリューション

UPDATE

だろう、私はちょうどそれを割り当てるべきであることに気づいViewModelViewModel.Model変更は、テンプレートは、変更を反映するときそれはすべきだ。ここに私の更新のXAMLです:

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

は、しかし、私はまだあなたがReactiveUIを使用しての背後にあるコードでStringFormatを設定することができますかどうかを知りたいと思います。

答えて

1

あなたは、コンバータをバインディングインラインを使用しての背後にあるコード(あなたのテキストボックスには名前が必要になります)にバインド操作を行うことができます。

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

および方法:

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 
} 
関連する問題