.Net DataBinding一个具有值类型属性的新对象

时间:2008-10-24 15:41:14

标签: .net wpf silverlight data-binding

使用数据绑定,如何绑定使用值类型的新对象?

简单示例:

public class Person() {
    private string _firstName;
    private DateTime _birthdate;
    private int _favoriteNumber;
    //Properties
}

如果我创建一个新的Person()并将其绑定到带有文本框的表单。出生日期显示为01/01/0001,收藏夹数字显示为0.这些字段是必填字段,但我希望这些字段为空并让用户填写它们。

解决方案还需要能够默认字段。在我们的示例中,我可能希望收藏号码默认为42。

我特别询问Silverlight,但我认为WPF和WinForms可能有同样的问题。

修改

我想到了Nullable类型,但是我们当前在客户端和服务器上使用相同的域对象,我不希望所需的字段为Nullable。我希望数据绑定引擎提供一种方法来知道它绑定了一个新对象吗?

5 个答案:

答案 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类型的更多信息:

http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx

答案 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。