TextBox:绑定为double,通过IMultiValueConverter转换:在ViewModel中更改值时不更新

时间:2012-07-20 13:46:35

标签: c# wpf formatting caliburn.micro imultivalueconverter

我正在使用Caliburn.Micro。

在我的视图中,我有TextBox绑定到double XButton,其中更改了 X 的值 X 视图模型。

public void ButtonPressed()
    {
        X = AnObject.GetDouble;
        NotifyOfPropertyChange(() => X);
    }

    public double X { get; set; }

我的目标是限制显示的小数位数。此数字可在应用程序中配置,因此可作为AnObject的属性使用。因此我定义了一个IMultiValueConverter

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return String.Format(values[1].ToString(), values[0]);
    }

并定义我的TextBox如下:

<TextBox>
     <TextBox.Text>
           <MultiBinding Converter="{StaticResource coordinateConverter}" >
                 <Binding Path="X" />
                 <Binding Path="AnObject.FormatNumberOfDecimals" />
           </MultiBinding>
     </TextBox.Text>
</TextBox>

什么有效: X的初始值为零,格式正确。

什么不起作用:按下该按钮时,新值不会显示在TextBox中。

欢迎不使用IMultiValueConverter的建议。

3 个答案:

答案 0 :(得分:0)

事实证明,我的string FormatNumberOfDecimals格式为{0:0.0000},而不是0.00000

0.0000适用于Label的ContentStringFormat,在我的Visual Studio Designer中不会导致异常,但在使用String.Format()时显然无法在TextBox上使用。

{0:0.0000}使用String.Format()在Label的ContentStringFormat和我的TextBox上工作。不幸的是,我的Visual Studio Design视图现在抛出一个异常,对于带有我的TextBox的视图没有用。

System.FormatException
Input string was not in a correct format.
at System.Text.StringBuilder.AppendFormat(IFormatProvider provider, String format, Object[] args)
at System.String.Format(IFormatProvider provider, String format, Object[] args)
at System.String.Format(String format, Object arg0)

答案 1 :(得分:0)

我过去也遇到过这样的问题,当其中一个绑定值更新时,MultiConverter不会自动更新。

由于您没有使用绑定作为第二个值,因此您可以切换为单个IValueConverter,并将格式作为ConverterParameter

传递

或者只是使用绑定的StringFormat属性

<TextBox Text="{Binding X, StringFormat=D4}" />

请注意,如果绑定Content属性而不是Text属性,例如Label,则绑定的StringFormat属性将不起作用而您需要设置Label的ContentStringFormat属性。

答案 2 :(得分:-1)

这是工作

十进制借记= 0; 十进制信用= 0;

        decimal.TryParse(values[0].ToString(), out debit);
        decimal.TryParse(values[1].ToString(), out credit);

        decimal total = debit - credit;

        return total.ToString("0.00"); // string form