1

Я написал пользовательскую активность, которая содержит простой ExpressionTextBox:Хотя активность в WF 4 rehosted дизайнер

 <sapv:ExpressionTextBox HintText="List of Strings" 
     Grid.Row ="0" Grid.Column="1" MaxWidth="150" MinWidth="150" Margin="5" 
     OwnerActivity="{Binding Path=ModelItem}" 
     Expression="{Binding Path=ModelItem.Test, Mode=TwoWay, 
      Converter={StaticResource ArgumentToExpressionConverter}, 
      ConverterParameter=In }" /> 

В библиотеке, я добавил тест собственности следующим образом:

 public InArgument<string> Test { get; set; } 

Так это все дело:

enter image description here

Через некоторое время и переменная i типа i, определенная в ее объеме. Я бы ожидать, чтобы получить обратно «Test1», «test2» ... и так далее, но вместо этого я получаю:

enter image description here

Итак, что переменная я рассматривается как строка, а не интерпретируется как целое число определенных в разделе переменных. Я тоже пробовал это с простым свойством типа string. Тогда я думал, что InArgument может справиться с этим. Я не знаю, что делать больше. Какие-нибудь подсказки об этом?

+0

Вы можете добавить весь код, пожалуйста? – DotNetHitMan

+0

@DotNetHitMan. Я только что нашел аналогичный вопрос здесь: http://stackoverflow.com/questions/8350154/how-to-access-variables-in-windows-workflow-in-vb-expressions-constructed-at-run. Как сказал Рон Якобс тогда, это было невозможно. Я не уверен в каких-либо новых функциях, но для меня он все еще не работает. –

ответ

1

Возможно, мне понадобится дополнительная информация о вашем размещении кода, чтобы bb мог больше помочь и полностью понять, чего вы хотите достичь. Но из снимка экрана я вижу, что вы не получаете доступ к аргументам времени выполнения в методе метаданных кеша. Впоследствии метод консольной записи, который вы вызываете, интерпретирует необработанное текстовое значение, а не правильно оценивает выражение.

Попробуйте следующее в программном коде деятельности

using System; 
using System.ComponentModel; 
using System.IO; 
using System.Runtime; 
using System.Activities.Validation; 
using System.Collections.Generic; 
using System.Windows.Markup; 
using System.Collections.ObjectModel; 
using System.Activities; 

namespace WorkflowConsoleApplication2 
{ 

    public sealed class CodeActivity1 : CodeActivity 
    { 
     // Define an activity input argument of type string 
     [DefaultValue(null)] 
     public InArgument<string> Test 
     { 
      get; 
      set; 
     } 

     protected override void CacheMetadata(CodeActivityMetadata metadata) 
     { 
      RuntimeArgument textArgument = new RuntimeArgument("Test", typeof(string), ArgumentDirection.In); 
      metadata.Bind(this.Test, textArgument); 


      metadata.SetArgumentsCollection(
      new Collection<RuntimeArgument> 
      { 
       textArgument, 
      }); 
     } 

     // If your activity returns a value, derive from CodeActivity<TResult> 
     // and return the value from the Execute method. 
     protected override void Execute(CodeActivityContext context) 
     { 
      Console.WriteLine(this.Test.Get(context)); 
     } 
} 

}

+0

Вау, это сработало. Большое спасибо. Я собираюсь отдохнуть и отпраздновать с кофе. –

+0

Кофе всегда хороший способ праздновать. – DotNetHitMan