将TextBox与ReactiveUI绑定并保持货币格式

3
有没有一种方法可以将decimal与WPF TextBox绑定,并指定一个StringFormat(在这种情况下是货币)?我已经尝试使用View Model中的属性来实现,但在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;
   });

然而,在更改 DataContext 后,{Binding} 没有如我所预期的那样改变。

有没有一种方法可以使用 this.Bind 并指定 StringFormat?对我来说,这将是理想的解决方案。

更新

在设置 DataContext 的情况下,我意识到应该将其分配给 ViewModel ,当 ViewModel.Model 更改时,模板会正确地反映出更改。以下是我的更新后的 xaml:

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

然而,我仍然想知道你是否可以使用ReactiveUI在代码后端设置StringFormat

1个回答

3
你可以使用内联绑定转换器,在代码后台执行绑定(你的文本框需要一个名称):
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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接