使用数据绑定,如何绑定使用值类型的新对象?
简单示例:
public class Person() {
private string _firstName;
private DateTime _birthdate;
private int _favoriteNumber;
//Properties
}
如果我创建一个新的Person()并将其绑定到带有文本框的表单。出生日期显示为01/01/0001,收藏夹数字显示为0.这些字段是必填字段,但我希望这些字段为空并让用户填写它们。
解决方案还需要能够默认字段。在我们的示例中,我可能希望收藏号码默认为42。
我特别询问Silverlight,但我认为WPF和WinForms可能有同样的问题。
修改
我想到了Nullable类型,但是我们当前在客户端和服务器上使用相同的域对象,我不希望所需的字段为Nullable。我希望数据绑定引擎提供一种方法来知道它绑定了一个新对象吗?
答案 0 :(得分:2)
也许您可以尝试Nullable类型?
public class Person() {
private string? _firstName;
private DateTime? _birthdate;
private int? _favoriteNumber;
//Properties
}
或
public class Person() {
private Nullable<string> _firstName;
private Nullable<DateTime> _birthdate;
private Nullable<int> _favoriteNumber;
//Properties
}
实际上是相同的。
现在,默认值为null,您可以通过设置它们来强制属性具有值。
有关Nullable类型的更多信息:
答案 1 :(得分:1)
尝试使用值转换器,这是一个应该启动的示例。
基本思想是在显示数据时将类型的默认值转换为null,并在更新绑定源时将任何空值转换回类型默认值。
public class DefaultValueToNullConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
object result = value;
Type valueType = parameter as Type;
if (value != null && valueType != null && value.Equals(defautValue(valueType)))
{
result = null;
}
return result;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
object result = value;
Type valueType = parameter as Type;
if (value == null && valueType != null )
{
result = defautValue(valueType);
}
return result;
}
private object defautValue(Type type)
{
object result = null;
if (type == typeof(int))
{
result = 0;
}
else if (type == typeof(DateTime))
{
result = DateTime.MinValue;
}
return result;
}
}
然后在你的xaml中引用像这样的转换器
<Page.Resources>
<local:DefaultValueToNullConverter x:Key="DefaultValueToNullConverter"/>
</Page.Resources>
<TextBox
Text="{Binding
Path=BirthDate,
Converter={StaticResource DefaultValueToNullConverter},
ConverterParameter={x:Type sys:DateTime}}"
/>
答案 2 :(得分:0)
我会重写Person类,看起来更像这样......
public class Person
{
private int _favoriteNumber = 0;
public string FavoriteNumber
{
get
{
return _favoriteNumber > 0 ? _favoriteNumber.ToString() : string.Empty;
}
set
{
_favoriteNumber = Convert.ToInt32(value);
}
}
private DateTime _birthDate = DateTime.MinValue;
private string BirthDate
{
get
{
return _birthDate == DateTime.MinValue ? string.Empty : _birthDate.ToString(); //or _birthDate.ToShortDateString() etc etc
}
set
{
_birthDate = DateTime.Parse(value);
}
}
}
答案 3 :(得分:0)
您可以使用IValueConverter根据对象的值将文本框绑定格式化为默认值。这是IValueConverter
上的一些链接http://ascendedguard.com/2007/08/data-binding-with-value-converters.html http://weblogs.asp.net/marianor/archive/2007/09/18/using-ivalueconverter-to-format-binding-values-in-wpf.aspx
不幸的是,这可能不是您需要的,因为您没有为每个属性选择Nullable值。
您可以做的是在进行数据绑定时设置对象的默认属性。
您可以通过将Person.Empty对象作为默认值来执行此操作。或者在设置DataContext时显式设置这些值。
无论哪种方式都应该有效:)
答案 4 :(得分:0)
将转换器安装到位后,还需要在Person对象上实现INotifyPropertyChanged。这样你可以设置绑定的Mode = TwoWay双向数据绑定将在文本框上进行更改时更新对象中的值,并且可以访问vis。