【问题标题】:Retrieve activity name检索活动名称
【发布时间】:2024-01-12 11:37:02
【问题描述】:

我在一个 WPF 项目中工作,我需要一个要求。 这是我的主窗口:

http://img210.imageshack.us/img210/9752/rule.jpg

所以,我希望当我拖放一个自定义活动(聚合函数)时,在 Compute TextBox 中显示他的名字......有什么办法吗????

例如:

1) 拖放 MaxActivity

2) 在TextBox中显示计算:MaxActivity

3) 拖放 SumActivity

4) 在TextBox中显示计算:MaxActivity + SumActivity

5) 拖放 MaxActivity

6) 在TextBox计算中显示:MaxActivity + SumActivity + MaxActivity1

非常感谢!

【问题讨论】:

  • 我强烈建议从Bea Stollnitz's blog here 上找到的关于拖放数据绑定项的代码开始。我过去曾实现过类似的功能,用户可以将查询“片段”从应用程序的一个部分拖放到另一个部分,并从中构建一个动态查询。
  • @Rachel:这完全是另外一头野兽。我们谈论的是 Workflow 4,它在 WPF 之上增加了一堆复杂性。
  • @Will Ah 我错过了工作流标签,谢谢 :)

标签: c# wpf visual-studio-2010 workflow-foundation-4


【解决方案1】:
  1. 我强烈建议您避免这种设计,因为无论您最终实现它都会给您的代码带来脆弱性而没有任何好处(我已经看到您正在汇总最大值和总和,为什么还要告诉我?)
  2. 如果继续,请摆脱那个“计算”文本框。文本框 = 输入文本。您只是在重新表述设计表面中已有的内容。允许我更改您生成的文本是没有意义的。使用文本块或标签。
  3. 不要,我再说一遍,不要将它保存在您的活动中。这是所有 UI 任务,不应将此信息保存在您的 Activity 配置中

如果你有这个

public sealed class MyActivity : Activity
{
    public string Compute {get;set;} // NO!

还有这个

<!-- NO! -->
<Label>Compute</Label><TextBox Text="{Binding ModelItem.Compute}"/>

你可能做错了。

那么,你是怎么做到的呢?

您可以解析出您的 ModelItem 并通过收听 changes in the ModelItem 并每次构造此字符串来生成此字符串。请注意,调用构造函数时不会设置您的 ModelItem,因此您将不得不监听 ActivityDesigner.ModelItem 属性的更改。没有事件,所以你必须知道如何listen to changes in a DependencyProperty.

一旦您监听到 ModelItem 中的更改,无论何时发生更改,您都可以walk down your ModelItem(这困难)或者只是从 ModelItem 中获取 Activity 并检查它。

var child = ModelItem.Properties["Child"].Value.GetCurrentValue();
if(child == null)
    computeTextBox.Text = "Please add some computation stuff.";
else
    // hard stuff goes here...

沿着从 Activity 的子节点到其中包含的任何 Activity 的路径走下去可能是危险的,因为您不能假设您的用户已经抛出了一个序列而不是单个 MaxActivity,或者他们没有七个嵌套序列等等。所以你必须有一套相当复杂和脆弱的ifelse 逻辑来尝试解析下面包含的内容。如果您开始在 ModelItem 之外更改 Activity 树的属性,您将无法与 UI 同步。

现在,读完之后,回到第 1 点。我在这个答案中列出并遵循我的建议。彻底放弃这个想法。

【讨论】:

  • 我添加这些聚合函数以在我作为参数或变量引入的一些数组中进行一些查询
  • Compute的文本框:这个文本框包含工作流执行后每个活动的结果
  • @XaviGuirao:不幸的是,您似乎对工作流程的工作方式存在误解。您不会在工作流的设计器中显示执行结果。
  • Ups 对不起,我之前很困惑。我指的是在这个文本框中,我有之前执行的所有活动,都添加到了设计器中