1

モデルとして複雑なデータ型を持つRIASilverlight4アプリがあります。おなじみの例として、aspnet_Membershipというメンバーオブジェクトを持つaspnet_Userと呼びましょう。aspnet_Userには「UserName」というメンバーがあり、aspnet_Membershipには「Email」というメンバーがあります。ここで、aspnet_Userをデータコンテキストとして使用して、aspnet_Userまたは添付されたaspnet_Membershipの変更にバインドします。つまり、aspnet_Userが「ダーティ」であるかどうかを表示します。aspnet_User.UserNameまたはaspnet_Membership.Emailのいずれかを変更すると、ダーティフラグが表示されます。以前、Converterを実装し、オブジェクトのEntityStateにバインドしました。これは、単純なプロパティがダーティであるかどうかを示すのに適していますが、aspnet_Membershipメンバーのアスペクトが編集されてもEntityStateは変更されません。

変更されたEntityStateをaspnet_Userまたはaspnet_membershipに反映するBubbledEntityStateというプロパティを実装しようとしました。これは、Silverlightプロジェクトの部分クラスで定義されています。これは、aspnet_Userまたはそのメンバーaspnet_MembershipのEntityStatePropertyChangedイベントに反応する必要があります。そこで、部分的なOnCreatedメソッドでこれらのイベントを処理しようとしました。不思議なことに、しかしこれはまったく呼び出されていません。メソッドは次のとおりです。publicpartialclassaspnet_User {

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

...}

aspnet_Userオブジェクトはサーバー上で構築され、RIAがWCF呼び出しを行った後にクライアント上で再構成された場合、「再構築」されないと想定しています。これは私に独特の印象を与えます。私は気難しいことをしていますか?誰かがこれに対処するためのより良い方法を手に入れましたか?

4

1 に答える 1

1

OK、これで動作します。まだ少し複雑に見えますが、OnCreated部分メソッドを使用するのではなく、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;
        }
    }
于 2009-12-14T14:02:36.993 に答える