2008-10-24 5 views
2

À l'aide de la liaison de données, comment lier un nouvel objet qui utilise des types de valeur?.Net DataBinding un nouvel objet avec des propriétés de type valeur

Exemple simple:

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

Si je crée une nouvelle personne() et le lier à une forme avec des zones de texte. La date de naissance est 01/01/0001 et le numéro préféré est 0. Ces champs sont obligatoires, mais je voudrais que ces champs soient vides et que l'utilisateur les remplisse.

La solution doit également pouvoir être par défaut des champs. Dans notre exemple, je souhaiterais que le nombre de favoris soit par défaut à 42.

Je demande spécifiquement à propos de Silverlight, mais je suppose que WPF et WinForms ont probablement le même problème.

EDIT:

Je pensais que des types Nullable, mais nous utilisons actuellement les mêmes objets de domaine sur le client et le serveur et je ne veux pas avoir les champs nécessaires soient Nullable. J'espère que le moteur de liaison de données expose un moyen de savoir qu'il lie un nouvel objet?

Répondre

2

Peut-être que vous pouvez essayer les types Nullable?

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

ou

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

qui est en fait la même chose. Maintenant, les valeurs par défaut sont null et vous pouvez forcer les propriétés à avoir une valeur en les définissant.

En savoir plus sur les types nullables:

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

0

Je réécris la classe Person pour ressemble à quelque chose comme ça ... plus

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); 
     } 
    } 
    } 
0

Vous pouvez utiliser le IValueConverter pour formater votre zone de texte liaisons aux valeurs par défaut basées sur la valeur de l'objet. Voici quelques liens sur le 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

Malheureusement, cela pourrait ne pas être ce que vous avez besoin puisque vous n'avez pas l'option de la valeur Nullable pour chacune de ces propriétés.

Ce que vous pouvez faire est de définir les propriétés par défaut pour votre objet lorsque vous effectuez la liaison de données.

Vous pouvez le faire en ayant un objet Person.Empty pour les valeurs par défaut. Ou définissez ces valeurs explicitement lorsque le DataContext est défini.

De toute façon devrait fonctionner bien :)

1

Essayez d'utiliser un convertisseur de valeur, voici un exemple qui devrait faire votre commencé.

L'idée de base est de convertir la valeur par défaut d'un type en valeur nulle lors de l'affichage des données et de convertir toutes les valeurs NULL en valeur par défaut, lorsque la source de liaison est mise à jour.

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; 
    } 
} 

Ensuite, dans votre XAML référence au convertisseur comme celui-ci

<Page.Resources> 
    <local:DefaultValueToNullConverter x:Key="DefaultValueToNullConverter"/> 
</Page.Resources> 

<TextBox 
    Text="{Binding 
      Path=BirthDate, 
      Converter={StaticResource DefaultValueToNullConverter}, 
      ConverterParameter={x:Type sys:DateTime}}" 
    /> 
0

Une fois que vous avez votre convertisseur en place, vous devez également impliment INotifyPropertyChanged sur l'objet Personne. De cette façon, vous pouvez définir la liaison Mode = TwoWay liaison de données bidirectionnelle mettra à jour la valeur dans l'objet quand une modification est faite sur la zone de texte, et vis a vis.

Questions connexes