【发布时间】:2013-03-07 13:47:51
【问题描述】:
我正在重新托管我的设计器,并添加了一个工具箱项,其中包含一个 WorkflowItemsPresenter 来呈现多个子活动项。所以我的模型项目有一个集合:
Sequence _innerSequence = new Sequence();
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
[Browsable(false)]
[Description("")]
public Collection<Activity> Activities { get { return _innerSequence.Activities; } }
绑定是
<sap:WorkflowItemsPresenter Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" Items="{Binding Path=ModelItem.Activities}" VerticalAlignment="Center" HorizontalAlignment="Center" HintText="Drop activities here">
<sap:WorkflowItemsPresenter.SpacerTemplate>
<DataTemplate>
<Label HorizontalAlignment="Center" Height="21"/>
</DataTemplate>
</sap:WorkflowItemsPresenter.SpacerTemplate>
</sap:WorkflowItemsPresenter>
加载设计器时,绑定工作得很好。现在,当设计器上的某些过滤器更新时,我想清除并将新项目添加到此集合中。因此,在此过滤器属性的 set 访问器中,我调用了一个方法,该方法执行以下操作:
private void RefreshApplication()
{
Activities.Clear();
Activities.Add(new AddXYZApplication() { ApplicationName = "Test" });
}
虽然集合得到更新,但设计器不会刷新。我知道有一种方法可以通过编写一些设计器代码隐藏(即通过模型项树更新集合)来做到这一点,但我理想情况下希望没有代码隐藏并希望它像任何其他 WPF 应用程序一样工作。 任何帮助都将不胜感激,因为我从现在开始一直在尝试设计一种方法(使用多重绑定、使用事件等)。
欢呼, V
【问题讨论】:
-
您已经回答了自己的问题。如果您绑定到
ModelItem,您应该对其进行更新。这对您的所有工作流程都有效,不仅适用于您的自定义设计器,如果您希望更改反映在整个工作流程设计器中。 -
感谢您的回复@Jota,并为延迟回复表示歉意。我确实理解任何更改都必须通过 ModelItem 进行路由,以便设计师刷新。但是,就像当我为我的 InArgument 活动属性设置值并且设计器在无需通过 ModelItem 推送值的情况下刷新一样,类似地,当我向我的 Collection 活动属性添加键时,不应该通知设计器。我必须编写设计器代码隐藏来访问视图 ModelItem 并将键添加到集合中以供设计器刷新。虽然它有效,但它更像是一种黑客攻击。有什么建议吗?
-
您可以直接更改您的 Activity 并在每次更改某些内容时执行
WorkflowDesigner.Load,但这是 hack 方式,它不会与 ModelItem 同步这就是你真正编辑的内容。我不明白为什么通过代码隐藏访问 ModelItem 可能是一种黑客行为。这是正确的方法。即使在 WPF-MVVM 应用程序上,您有时也必须编写代码隐藏,这非常好。 -
感谢@Jota ...只是编写代码隐藏对我的应用程序的设计方式有点限制。
标签: workflow-foundation-4 activitydesigner