PostSharp NotifyPropertyChanged设置取决于.On

时间:2014-11-20 13:32:35

标签: postsharp

我遇到PostSharp NotifyPropertyChanged方面的问题。我将实现模型架构作为复合模式。我的问题是没有为TaskGroup.PercentDone引发PropertyChanged。

Tasks属性是ITask的List,因此可以有TaskGroup或SimpleTask。 SimpleTask具有自动属性PercentDone并正确触发PropertyChanged事件。

对于TaskGroup.PercentDone我必须使用[SafeForDependencyAnalysis],如果我不使用我得到编译错误。但我无法弄清楚如何使用Depends.On()

我尝试了很多像这样的解决方案。

Depends.On(this.Tasks.Sum(task => task.PercentDone)); 

foreach (var task in this.Tasks)
{
    Depends.On(task.PercentDone);
}

Depends.On(this.Tasks); 

但我无法想象。

class TaskGroup : TaskBase, IComposite<ITaskModel>
{
    [SafeForDependencyAnalysis]
    public override int PercentDone
    {
        get
        {
            //BUG event ProperityChanges is not raised
            int percentDone = this.Tasks.Sum(task => task.PercentDone);
            return percentDone / this.tasks.Count;
        }
        set
        {
            foreach (var task in this.tasks)
            {
                task.PercentDone = value;
            }
        }
    }

    ...

}

我使用的是PostSharp 4.0.36.0的最新版本。

我在谷歌上找不到类似的问题,但这是很常见的事情,我谷歌搜索错了?你可以指引我朝着正确的方向前进。我非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

目前,NotifyPropertyChangedAspect仅支持Depends.On中的属性链,即origin.Property1.Property2,类似于文档中所述。前两个表达式将被忽略,因为表达式需要以字段或this开头,并且除了一个接一个地链接的属性访问之外什么都不包含。

通常所有“矢量”操作都是不可能的。因此,您需要手动实现此类行为。例如,您可能想要注册到集合的INotifyCollectionChanged

PostSharp确实应该至少产生一条错误消息,目前它只是忽略了Depends.On。这将是一个非常好的功能,我们可能会在未来考虑它(考虑在our UserVoice Page上投票。)