1 votes

RIA, Silverlight 4, EntityStates et Complex Types

J'ai une application RIA Silverlight 4 avec un type de données complexe en tant que modèle. Comme exemple familier, appelons-le aspnet_User qui a un objet membre appelé aspnet_Membership; aspnet_User a un membre appelé "UserName" et aspnet_Membership a un membre appelé "Email". Maintenant, en utilisant aspnet_User comme un contexte de données, je veux lier à tous les changements dans aspnet_User ou un aspnet_Membership attaché - c'est-à-dire que je veux montrer si un aspnet_User est 'dirty'. Le drapeau dirty devrait montrer si je change soit aspnet_User.UserName ou aspnet_Membership.Email. Auparavant, j'ai implémenté un Convertisseur et lié à l'EntityState sur un objet, et c'est bien pour montrer si des propriétés simples sont dirty mais EntityState n'est pas modifié lorsque des aspects du membre aspnet_Membership sont modifiés.

J'ai essayé d'implémenter une propriété appelée BubbledEntityState qui reflète un EntityState modifié sur aspnet_User ou aspnet_membership. Il est défini dans une classe partielle dans le projet Silverlight. Cela doit réagir aux événements PropertyChanged de EntityState sur aspnet_User ou son membre aspnet_Membership. J'ai donc essayé de gérer ces événements dans la méthode partielle OnCreated. Étrangement cependant, cela n'est pas appelé du tout. Voici la méthode: public partial class aspnet_User {

    partial void OnCreated()
    {
        this.aspnet_Membership.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(aspnet_Membership_PropertyChanged);
        this.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(aspnet_User_PropertyChanged);
    }

... }

Je présume que les objets aspnet_User sont construits sur le serveur et ne sont pas 'reconstruits' lorsqu'ils sont reconstitués sur le client après que RIA ait effectué son appel WCF. Cela me semble curieux. Est-ce que je fais quelque chose de bizarre? Quelqu'un a une meilleure façon de gérer cela?

1voto

Eskander Bejaoui Points 121

D'accord, j'ai réussi à le faire fonctionner. Cela semble toujours un peu compliqué, mais au lieu d'utiliser la méthode partielle OnCreated, j'ai surchargé la méthode OnLoaded :

protected override void OnLoaded(bool isInitialLoad)
        {
            base.OnLoaded(isInitialLoad);
            this.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(aspnet_User_PropertyChanged);
        }

    partial void OnCreated()
    {

    }

    void aspnet_User_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "aspnet_Membership")
        {
            if (this.aspnet_Membership != null)
            {
                this.aspnet_Membership.PropertyChanged+=new System.ComponentModel.PropertyChangedEventHandler(aspnet_Membership_PropertyChanged);
            }
        }
        if (e.PropertyName == "EntityState")
            this.OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs("BubbledEntityState"));
    }

    void aspnet_Membership_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "EntityState")
            this.OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs("BubbledEntityState"));
    }

    public EntityState BubbledEntityState
        {
            get
            {
                if (this.EntityState== System.Windows.Ria.EntityState.Unmodified)
                {
                    if (this.aspnet_Membership==null)
                        return System.Windows.Ria.EntityState.Unmodified;
                    if (this.aspnet_Membership.EntityState== System.Windows.Ria.EntityState.Modified)
                        return System.Windows.Ria.EntityState.Modified;
                    return System.Windows.Ria.EntityState.Unmodified;
                }
                return this.EntityState;
            }
        }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X