检索活动名称

时间:2012-06-29 15:51:36

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

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

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

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

例如:

1)拖放MaxActivity

2)在TextBox计算中显示:MaxActivity

3)拖放SumActivity

4)在TextBox Compute中显示:MaxActivity + SumActivity

5)拖放MaxActivity

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

非常感谢!

1 个答案:

答案 0 :(得分:2)

  1. 我强烈建议你避免这种设计,因为你最终实现它会给你的代码带来脆弱而没有任何好处(我已经可以看到你正在汇总最大值和总和,为什么还要告诉我?)
  2. 如果你继续,摆脱那个“Compute”TextBox。 TextBoxes =输入文字。您只是在改写设计界面中已有的内容。允许我更改您生成的文本是没有意义的。使用TextBlock或Label。
  3. 不要,我再说一遍,将此保存在您的活动中。这是所有UI任务,不应将此信息保存在“活动配置”
  4. 如果你有这个

    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 hard )或者只是从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的孩子到内部任何活动的路径走向可能是危险的,因为你不能假设你的用户已经抛出了序列而不是单个MaxActivity,或者他们没有七个嵌套的序列等等。所以你必须有一套非常复杂和脆弱的if else逻辑来尝试解析下面包含的内容。如果您开始在ModelItem之外更改Activity树的属性,那么您将与UI不同步。

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