2009-10-09 7 views
0

J'ai une classe personnalisée appelée "Paramètre" et une activité personnalisée avec la propriété de collection générique appelée "Paramètres", et je veux définir les liaisons pour l'un des paramètres dans le liste générique de paramètres propriété, j'ai essayé avec activitybind, mais il ne fonctionne pas, est-il possible de le faire avec la fondation de flux de travail? S'il vous plaît voir codes ci-dessous:Comment définir les liaisons pour les propriétés génériques de l'activité personnalisée dans la fondation de workflow

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)); 
} 

// Une activité personnalisée avec propriété générique

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)); 

// code Designer

#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; 

Répondre

1

Je viens de rencontrer dans ce même problème et je l'ai résolu par simplement éliminer le besoin de la collection.

Vous pouvez faire la même chose assez facilement:

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

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

Vous pouvez alors lier que votre propriété de dépendance au lieu de la liste.

2

J'ai fait un travail supplémentaire dans ce domaine comme ma réponse précédente, bien que techniquement utilisable n'est pas vraiment idéal. J'ai donc trouvé une meilleure solution.

Fondamentalement, lors de la liaison des propriétés, le concepteur intégré «devine» le contrôle à charger lorsque vous cliquez sur les points de suspension dans la boîte de propriétés. Lorsque vous le pointez sur une liste, il charge un éditeur sophistiqué qui vous permet d'ajouter manuellement des éléments de liste, ce qui est fondamentalement inutile pour tout type de scénario de données dynamiques.

je fait quelques recherches et trébuché sur ce poste: http://blogs.microsoft.co.il/blogs/bursteg/archive/2006/10/29/DynamicWorkflowBindingParameters.aspx

Il n'a pas été exactement ce que je avais besoin, mais il ne me la moindre idée pour l'attribut Editor.

Le « quoi ai-je besoin de savoir » une partie de cette réponse est ici, il suffit d'ajouter cet attribut à votre déclaration de propriété (la propriété réelle, pas le champ de support DependencyProperty):

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

Cela forcera l'interface graphique pour charger l'interface de liaison de propriété de dépendance.

Ce n'est pas vraiment un défaut de la structure de workflow elle-même, mais c'était assez ennuyeux d'avoir à creuser si profondément pour comprendre la solution. Il semble que partout où vous vous tournez avec Windows Workflow, les questions sont là mais pas les réponses.

De toute façon, j'espère que cela vous aidera ou quelqu'un d'autre si vous rencontrez ce problème.

Questions connexes