我有一个名为“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;
答案 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);
}
}
然后,您可以将其绑定到依赖项属性而不是列表。