我正在使用Caliburn.Micro.
在我的视图中,我有一个绑定到double X
的TextBox
和一个更改ViewModel中X值的Button
。
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的建议。
原来我的string FormatNumberOfDecimals
的格式应该是{0:0.0000}
,而不是0.00000
。
0.0000
适用于标签的ContentStringFormat,在我的Visual Studio设计器中不会引起异常,但在使用String.Format()
时显然不适用于TextBox。
{0:0.0000}
处理标签的ContentStringFormat,并使用String.Format()
处理我的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)
我过去也遇到过这样的问题,当其中一个绑定值更新时,MultiConverter
不会自动更新。
由于您没有为第二个值使用绑定,因此可以切换到单个IValueConverter
,并将您的格式作为ConverterParameter
传入
或者简单地使用绑定的StringFormat
属性
<TextBox Text="{Binding X, StringFormat=D4}" />
请注意,如果要绑定Content
属性而不是Text
属性,例如在Label
上,则绑定的StringFormat
属性将不起作用,需要改为设置Label的ContentStringFormat
属性。
这就是工作
十进制借方=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