2017-09-14 7 views
1

decimal을 WPF TextBox에 바인딩하고 StringFormat (이 경우 통화)을 지정하는 방법이 있습니까? 내가보기 모델의 속성이 일을 시도했지만,이 후 서식을 적용하려고으로 텍스트 상자의 편집이 좀 황당하게 모든 키 입력 :ReactiveUI를 사용하여 TextBox 바인딩 및 통화 서식 유지

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

그러나 내가 예상했던대로 변경되지 않습니다 {Binding}DataContext을 변경 한 후.

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 
}