如何在工作流基础中为自定义活动的常规属性设置绑定

时间:2009-10-09 14:55:44

标签: workflow properties generics binding

我有一个名为“Parameter”的自定义类和一个名为“Parameters”的泛型集合属性的自定义活动,我想在Parameters属性的通用列表中为其中一个参数设置绑定,我尝试使用activitybind,但它无法正常工作,有没有办法用工作流基础做到这一点?请参阅以下代码:

public class Parameter:DependencyObject //A Class
{
public string Name
{
    get { return (string)GetValue(NameProperty); }
    set { SetValue(NameProperty, value); }
}

// Using a DependencyProperty as the backing store for Name.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty NameProperty =
    DependencyProperty.Register("Name", typeof(string), typeof(Parameter));

public string Value
{
    get { return (string)GetValue(ValueProperty); }
    set { SetValue(ValueProperty, value); }
}

// Using a DependencyProperty as the backing store for Value.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty ValueProperty =
    DependencyProperty.Register("Value", typeof(string), typeof(Parameter));
}

//具有通用属性的自定义活动

    public partial class Activity1 : System.Workflow.ComponentModel.Activity
{
    public Activity1()
    {
        InitializeComponent();
    }

protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
{
    return base.Execute(executionContext);
}

public List<Parameter> Parameters
{
    get { return (List<Parameter>)GetValue(ParametersProperty); }
    set { SetValue(ParametersProperty, value); }
}

// Using a DependencyProperty as the backing store for Parameters.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty ParametersProperty =
    DependencyProperty.Register("Parameters", typeof(List<Parameter>), typeof(Activity1));

//设计师代码

   #region Designer generated code

    /// <summary> 
    /// Required method for Designer support - do not modify 
    /// the contents of this method with the code editor.
    /// </summary>
    [System.Diagnostics.DebuggerNonUserCode]
    private void InitializeComponent()
    {
        this.CanModifyActivities = true;
        this.activity12 = new ActivityLibrary1.Activity1();
        this.activity11 = new ActivityLibrary1.Activity1();

        List<Parameter> paras1 = new List<Parameter>();
        paras1.Add(new Parameter() { Name = "a", Value = "a" });
        paras1.Add(new Parameter() { Name = "b", Value = "b" });

        List<Parameter> paras2 = new List<Parameter>();
        paras2.Add(new Parameter() { Name = "c", Value = "c" });
        paras2.Add(new Parameter() { Name = "d", Value = "d" });
        // 
        // activity12
        // 
        this.activity12.Name = "activity12";
        this.activity12.Parameters = paras1;
        // 
        // activity11
        // 
        this.activity11.Name = "activity11";
        this.activity11.Parameters = paras2;


        ActivityBind bind = new ActivityBind();
        bind.Name = activity11.Name;
        bind.Path = "Parameters[0].Value";

        activity12.Parameters[0].SetBinding(Parameter.ValueProperty, bind);
        // 
        // Workflow1
        // 
        this.Activities.Add(this.activity11);
        this.Activities.Add(this.activity12);
        this.Name = "Workflow1";
        this.CanModifyActivities = false;

    }

    #endregion

    private ActivityLibrary1.Activity1 activity12;
    private ActivityLibrary1.Activity1 activity11;

2 个答案:

答案 0 :(得分:2)

我在这个领域做了一些额外的工作,就像我之前的回答一样,虽然技术上可用并不是很理想。所以我想出了一个更好的解决方案。

基本上,当绑定属性时,内置设计器会“猜测”在单击属性框中的省略号时要加载哪个控件。当您将其指向列表时,它会加载一些花哨的编辑器,允许您手动添加列表项,这对于任何类型的动态数据场景都是无用的。

我做了一些挖掘并绊倒了这篇文章:http://blogs.microsoft.co.il/blogs/bursteg/archive/2006/10/29/DynamicWorkflowBindingParameters.aspx

这不完全是我需要的,但它确实让我了解了编辑属性。

这个答案的“我需要知道的”是这里的一部分,只需将此属性添加到您的属性声明(实际属性,而不是DependencyProperty支持字段):

[Editor(typeof(BindUITypeEditor), typeof(UITypeEditor))]

这将强制GUI加载依赖项属性绑定接口。

这并不是工作流程框架本身的一个缺点,但是必须深入研究这个问题才能找到解决方案。你似乎随处可见Windows工作流程,问题就在那里而不是答案。

无论如何,如果你遇到这个问题,我希望这可以帮助你或其他人。

答案 1 :(得分:1)

我刚遇到同样的问题,我只是简单地消除了对集合的需求而​​解决了这个问题。

你可以很容易地做同样的事情:

public class Parameters {
  private Dictionary<string, string> _parameters;

  public void Add(string name, string value) {
    _parameters.Add(name, value);
  }
}

然后,您可以将其绑定到依赖项属性而不是列表。