如何在XAML设计器代码后置中访问CodeActivity的InArgument值
在Activity Designer代码后置中访问CodeActivity的InArgument值
你可以通过以下几种方式在OnTextChange方法中访问FirstName的相关内容:
方法1:通过Designer的ModelItem获取Activity实例
利用Activity Designer的ModelItem属性,直接获取当前设计的Class1实例,进而访问FirstName参数:
private void OnTextChange(object sender, RoutedEventArgs e) { // 获取当前设计的Activity对象 var targetActivity = this.ModelItem.GetCurrentValue() as Class1; if (targetActivity != null) { InArgument<string> firstNameArg = targetActivity.FirstName; // 如果要提取表达式的具体值(比如字面量) if (firstNameArg?.Expression is Literal<string> literalExpr) { string firstNameValue = literalExpr.Value; // 这里可以处理获取到的字面量值 } } }
方法2:直接读取绑定的TextBox文本
由于你的TextBox已经通过ArgumentToExpressionConverter与ModelItem.FirstName双向绑定,TextBox的Text值就是FirstName对应的表达式文本(比如字面量字符串、变量引用等),可以直接读取:
private void OnTextChange(object sender, RoutedEventArgs e) { var textBox = sender as TextBox; if (textBox != null) { string firstNameExpression = textBox.Text; // 这里使用firstNameExpression即可 } }
补充说明
InArgument本质是表达式容器,设计阶段它存储的是表达式(而非运行时的实际值),如果需要解析表达式内容,需要根据表达式类型(比如Literal、VariableReference等)做对应处理。- 确保在代码后置中引用对应的命名空间(比如
System.Activities、System.Activities.Presentation)。
原代码参考
CodeActivity类代码
[Designer(typeof(ActivityDesigner1))] public class Class1 : CodeActivity { public InArgument<String> FirstName { get; set; } protected override void Execute(CodeActivityContext context) { // Activity Action Logic } }
Activity Designer XAML代码
<sap:ActivityDesigner.Resources> <ResourceDictionary> <sapc:ArgumentToExpressionConverter x:Key="ArgumentToExpressionConverter" /> </ResourceDictionary> </sap:ActivityDesigner.Resources> <Grid x:Name="MyGrid"> <Grid.RowDefinitions> <RowDefinition Height="50"> </RowDefinition> <RowDefinition Height="50"></RowDefinition> </Grid.RowDefinitions> <TextBox x:Name="MyBtn" Grid.Row="0" Text = "{Binding Path=ModelItem.FirstName, Converter={StaticResource ArgumentToExpressionConverter},ConverterParameter=In, Mode=TwoWay}" TextChanged="OnTextChange" /> </Grid>
代码后置代码(修改后)
public partial class ActivityDesigner1 { public ActivityDesigner1() { InitializeComponent(); } private void OnTextChange(object sender, RoutedEventArgs e) { // 可以使用上面两种方法之一实现 var textBox = sender as TextBox; if (textBox != null) { string firstNameExpression = textBox.Text; // 处理逻辑 } } }
内容的提问来源于stack exchange,提问作者AnkitK
相关产品推荐
相关产品推荐

