【问题标题】:Adding item to collection does not refresh activity designer将项目添加到集合不会刷新活动设计器
【发布时间】: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


【解决方案1】:

只是在我的评论后回答。

当您通过 WorkflowDesigner 进行编辑时,您本身并没有 Activity。你所拥有的是一个 ModelItem

从您将活动加载到设计器的那一刻起,通过WorkflowDesigner.Load(activity),您不再有活动,您只需开始编辑ModelItem

您可以通过WorkflowDesigner.Text(刷新后)访问 XAML 并使用它做任何您想做的事情。例如将其加载到 ActivityBuilderWorkflowService 中,仅此而已。

设计师不知道也永远不会知道活动具有Collection&lt;Activities&gt;Collection&lt;Variable&gt; 或任何其他属性。他们只知道ModelItem 及其属性,句号。

在简历中:必须对 ModelItem 进行更改,因为这是设计师所绑定的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多