You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:22:42