这应该很容易,但我无法弄清楚。当我的自定义活动的某些属性发生变化时(例如,通过在 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 +">");
}
将活动包装在模型项中并没有使解决方案显而易见,是吗?很难看到发生了什么,但它确实有效。干得好,威尔!