【发布时间】:2013-04-09 19:11:28
【问题描述】:
这应该很容易,但我想不通。当我的自定义活动的某些属性发生变化时(例如,通过在 WF 设计器的属性网格中更改它),我想动态更新 DisplayName。我在属性设置器代码中这样做:
public sealed class TarpSpecItem : Activity, ITarpSpecItem, INotifyPropertyChanged
{
...
public DocumentationType Type
{
get { return _type; }
set { _type = value;
DisplayName = "<" + value.ToString() + ">";
OnPropertyChanged("DisplayName");
OnPropertyChanged("Type");
}
}
活动实现 INotifyPropertyChanged。然而,DisplayName 在设计器表面上并没有改变。我错过了什么?
威尔的回答是正确的。我将设计器 *.xaml.cs 的更新代码粘贴到此处作为单独的答案以具有正确的格式(不可能作为评论)。这段代码编译并解决了问题。
protected override void OnModelItemChanged(object newItem)
{
ModelItem modelItem = newItem as ModelItem;
if (modelItem != null)
modelItem.PropertyChanged += this.ModelItemPropertyChangedHandler;
base.OnModelItemChanged(newItem);
}
private void ModelItemPropertyChangedHandler(object sender, PropertyChangedEventArgs e)
{
if (!e.PropertyName.Equals("Type", StringComparison.OrdinalIgnoreCase))
return;
ModelItem.Properties["DisplayName"].SetValue("<" + ModelItem.Properties["Type"].Value +">");
}
将活动包装在模型项中不会使解决方案显而易见,是吗?很难看到发生了什么,但它确实有效。干得好,威尔!
【问题讨论】:
-
有关 ModelItem 的更多信息,请阅读此博客文章 blogs.msdn.com/b/mwinkle/archive/2009/10/28/… 最初有点混乱,但随着您与 WF 设计师合作,它会变得更加清晰。
-
@Will:很棒的博文,感谢您的指点。不知道什么时候我会处于我理解他所写的一切的状态...... :)
标签: workflow-foundation-4 activitydesigner