1

我有一个以复杂数据类型作为模型的 RIA silverlight 4 应用程序。作为一个熟悉的例子,我们称它为 aspnet_User,它有一个名为 aspnet_Membership 的成员对象;aspnet_User 有一个名为“UserName”的成员,aspnet_Membership 有一个名为“Email”的成员。现在使用 aspnet_User 作为数据上下文,我想绑定到 aspnet_User 或附加的 aspnet_Membership 中的任何更改 - 即我想显示 aspnet_User 是否“脏”。如果我更改 aspnet_User.UserName 或 aspnet_Membership.Email,则应显示脏标志。现在,我之前已经实现了一个转换器并绑定到一个对象上的 EntityState,这可以很好地显示简单属性是否是脏的,但是在编辑 aspnet_Membership 成员的各个方面时 EntityState 不会改变。

我试图实现一个名为 BubbledEntityState 的属性,它反映了 aspnet_User 或 aspnet_membership 上的修改后的 EntityState。它在 Silverlight 项目的部分类中定义。这需要对 aspnet_User 或其成员 aspnet_Membership 上的 EntityState PropertyChanged 事件作出反应。所以我尝试在部分 OnCreated 方法中处理这些事件。然而奇怪的是,这根本没有被调用。方法如下: 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);
    }

... }

我假设 aspnet_User 对象是在服务器上构建的,并且在 RIA 完成 WCF 调用后在客户端上重构它们时不会“重构”。这让我觉得很奇怪。我在做一些古怪的事情吗?有人有更好的方法来处理这个吗?

4

1 回答 1

1

好的,我有这个工作。它似乎仍然有点令人费解,但我没有使用 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 回答