사용자 지정 작업을 위해 디자이너에서 유효성 검사가 제대로 작동하는 데 문제가 있습니다.사용자 지정 작업 디자이너의 인수 유효성 확인
[Designer(typeof(DictionaryActivityDesigner))]
public class DictionaryActivity : NativeActivity
{
[Browsable(false)]
public Dictionary<string, InArgument> Arguments { get; set; }
public InArgument<string> StringArg { get; set; }
public DictionaryActivity()
{
Arguments = new Dictionary<string, InArgument>();
}
protected override void Execute(NativeActivityContext context)
{ }
}
나는 dinamically 편집 표현의 텍스트 상자를 만드는 디자이너에서 :
나는 사전에 저장 인수의 동적 컬렉션 지정 WF4 활동을 다음과 같이 동작을 재현하는 가장 간단한 샘플입니다 이 주장들. 사용자는 별도의 모달 창에서 인수와 그 유형을 정의 할 수있는 가능성을 가지고 있지만, 간단하게하기 위해 나는이 샘플의 인수를 해결 한 :
: 아래public partial class DictionaryActivityDesigner
{
private Dictionary<string, Type> definition;
public DictionaryActivityDesigner()
{
definition = new Dictionary<string, Type>
{
{ "String Arg", typeof(string) },
{ "Int Arg", typeof(int) }
};
InitializeComponent();
}
public void InitializeGrid(Dictionary<string, Type> arguments)
{
ArgumentsGrid.RowDefinitions.Clear();
ArgumentsGrid.Children.Clear();
int gridRow = 0;
foreach (var arg in arguments)
{
ArgumentsGrid.RowDefinitions.Add(new RowDefinition());
var label = new Label()
{
Content = arg.Key + ":"
};
Grid.SetRow(label, gridRow);
Grid.SetColumn(label, 0);
ArgumentsGrid.Children.Add(label);
var textbox = new ExpressionTextBox()
{
ExpressionType = arg.Value,
OwnerActivity = ModelItem,
UseLocationExpression = false
};
var binding = new Binding()
{
Mode = BindingMode.TwoWay,
Converter = new ArgumentToExpressionConverter(),
ConverterParameter = "In",
Path = new PropertyPath("ModelItem.Arguments[(0)]", arg.Key)
};
textbox.SetBinding(ExpressionTextBox.ExpressionProperty, binding);
Grid.SetRow(textbox, gridRow);
Grid.SetColumn(textbox, 1);
ArgumentsGrid.Children.Add(textbox);
gridRow++;
}
}
private void ActivityDesigner_Loaded(object sender, RoutedEventArgs e)
{
InitializeGrid(definition);
}
}
을 디자이너에 대한 XAML입니다
InitializeGrid
메서드는 인수에 대한 표현식 텍스트 상자를 ArgumentGrid
에 추가합니다. 그 아래에 (거의) 원하는 동작을 보여주기 위해 액티비티의 고정 인수에 대해 별도로 정적으로 정의 된 표현식 텍스트 상자가 있습니다. 문제에 대한 지금
잘못된 표현은 오류 아이콘이 텍스트 상자 옆에 나타날 수 있지만,이 경우처럼 디자이너의 메뉴 표시 줄에 전파되지 않습니다 정적으로 정의 된 텍스트 상자에 오류가 있습니다.
잘못된 상태로 디자이너를 닫고 정의를 저장하면 오류가 동적 텍스트 상자에만있는 경우에도 eror 아이콘이 위쪽 막대로 올바르게 전파됩니다. 나중에 그 행동이 더욱 이상해진다. 인수의 값을 변경 한 후에는 이제 텍스트 상자 옆의 오류 아이콘조차도 더 이상 일관되게 작동하지 않습니다.
나는 완전히, 사전에 값이 표현을 편집하기 전에의 경우처럼
<x:Null x:Key="String Arg" />
대신<InArgument x:TypeArguments="x:String" x:Key="String Arg">["a"]</InArgument>
하거나 항목을 ommiting으로 워크 플로우 정의에 나타난다있는 null로 설정됩니다 동적 텍스트 상자의 내용을 삭제하는 경우 처음으로. 이러한 워크 플로를 다시 열면 정적으로 만든 텍스트 상자가 제대로 작동하지 않습니다. 텍스트 상자에 포커스가 있고 더 이상 위쪽으로 전파되지 않으면 오류 아이콘이 표시됩니다.
동적 텍스트 상자를 만들 때 뭔가 잘못하고있는 것 같습니다. 그것을하는 올바른 방법은 무엇입니까? 동적 인수를 사용하여 사용자 지정 활동에 대한 디자이너를 만드는 데 사용할 수있는 예제가 있습니까?
편집 : 관심있는 사람들을 위해
: 나는 또한 posted the issue이 MSDN 포럼에 좀 더 많은 논의가 있었다
- .
- 그 토론의 결과로, 나는 또한 a report on Microsoft Connect을 신청했습니다.
잠깐, CacheMetadata를 호출 할 때마다 유효성 검사를 수행하지 않습니까? 이는 작업에 대한 유효성 검사를 수행하고 오류/경고를 워크 플로 위로 전달할 수있는 유일한 곳입니다. – Will
@Will CacheMetadata에서 유효성 검사 오류 및 경고를 추가 할 수 있지만 ExpressionTextBox에는 입력 된 표현식이 유효하지 않은 경우 텍스트 상자 옆에 오류 아이콘을 표시하는 자체 내장 유효성 검사가 있습니다. 그 유효성 검사를 다시 구현하고 싶지 않고 유효성 검사 오류를 추가하여 CacheMetadata에서 유효성 검사 기능에 직접 액세스하여 어떻게 전파 할 수 있는지 알지 못합니다. 또한 : 전파는 내가 인수의 수집을 피하는 한 잘 작동하는 것 같습니다. –