好的,使用WPF(使用MVVM)并遇到一个问题,想要一些输入。我有一个简单的课程
如下所示(假设我已实现IDataErrorInfo):
public class SimpleClassViewModel
{
DataModel Model {get;set;}
public int Fee {get { return Model.Fee;} set { Model.Fee = value;}}
}
然后我尝试在xaml中绑定它:
<TextBox Text={Binding Fee, ValidatesOnDataErrors=true}/>
当用户然后清除文本时,会发生数据绑定错误,因为它无法将string.empty转换为int。好吧,费用是必填字段,但因为数据绑定不会转换回来,所以我无法提供错误信息,因为我的课程没有更新。那么我是否需要做以下事情?
public class SimpleClassViewModel
{
DataModel Model {get;set;}
int? _Fee;
public int? Fee
{
get { return _Fee;}
set { _Fee = value;if (value.HasValue) { Model.Fee = value;}
}
}
答案 0 :(得分:5)
这可以使用ValueConverter完成:
using System.Windows.Data;
namespace MyNameSpace
{
class IntToStringConverter:IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((int) value).ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
int result;
var succes = int.TryParse((string) value,out result);
return succes ? result : 0;
}
}
}
您可以在XAML中引用它:
<Window xmlns:local="clr-namespace:MyNameSpace">
<Window.Resources>
<local:IntToStringConverter x:Key="IntConverter"/>
</Window.Resources>
<TextBox Text={Binding Fee, ValidatesOnDataErrors=true,
Converter={StaticResource IntConverter}}/>
</Window>
答案 1 :(得分:2)
您还可以利用您正在进行MVVM的事实,并将Fee
属性的类型更改为string
。毕竟,您的VM应提供支持该视图的模型,该视图允许用户输入string
。然后,您可以提供一个单独的属性,将解析的费用公开为int
。这样,您的转换逻辑就在Fee
属性中,使其更易于重用,调试和维护。