2017-09-14 51 views
1

是否有綁定一個decimal到WPF文本框和指定StringFormat(在這種情況下貨幣)的方法嗎?我試着在視圖模型的屬性這樣做,但因爲它試圖後應用的格式編輯在TextBox變得有點古怪每一次擊鍵:綁定文本框與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的方法嗎?對我來說,這將是一個理想的解決方案

UPDATE

在設置DataContext的情況下,我意識到,我應該只把它分配給ViewModelViewModel.Model變化,模板反映的變化正如它應該。這裏是我的更新XAML:

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

不過,我還是想知道,如果你可以在代碼中設置StringFormat後面使用ReactiveUI

回答

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 
}