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

替代已废弃的GetValue与SetValue方法:DependencyProperty操作方案咨询

嘿,我来帮你搞定这个DependencyProperty的GetValue/SetValue失效问题!既然你不想用废弃的System.Workflow,转投System.Activities的话,得注意它和传统WPF DP操作的几个关键区别,我给你捋清楚:

解决System.Activities中DP的GetValue/SetValue失效问题

1. 先确认DP的注册方式是否正确

在System.Activities的活动类(比如继承CodeActivity/Activity的子类)里,DP的注册逻辑和WPF类似,但必须遵循活动模型的规则:

  • DP必须是静态只读字段
  • 使用DependencyProperty.Register的正确重载(针对活动类型的重载)
  • 配套的包装属性要正确调用GetValue/SetValue

举个正确的注册示例:

public class RegexMaskActivity : CodeActivity
{
    // 注册正则掩码的DP
    public static readonly DependencyProperty RegexMaskProperty =
        DependencyProperty.Register(
            "RegexMask", 
            typeof(string), 
            typeof(RegexMaskActivity), 
            new PropertyMetadata(string.Empty)
        );

    // 包装属性
    public string RegexMask
    {
        get { return (string)GetValue(RegexMaskProperty); }
        set { SetValue(RegexMaskProperty, value); }
    }

    // ... 其他活动逻辑
}

2. 执行逻辑里必须通过活动上下文操作DP

这是最容易踩坑的点!在活动的执行阶段(比如CodeActivity.Execute方法),不能直接调用实例的GetValue/SetValue,因为System.Activities的运行时上下文托管着DP的实际值,实例本身的DP存储可能不是运行时的真实值。

正确的做法是用CodeActivityContext(对应CodeActivity)或者NativeActivityContext(对应NativeActivity)来获取/设置DP值:

protected override void Execute(CodeActivityContext context)
{
    // ✅ 正确:通过上下文获取当前掩码值
    string currentMask = context.GetValue(RegexMaskProperty);
    
    // ✅ 正确:通过上下文更新掩码值
    context.SetValue(RegexMaskProperty, @"^\d{6}$");
}

3. 活动外部设置DP的正确姿势

如果是在工作流设计器里,或者代码中构建活动实例时设置DP,直接用包装属性就没问题,比如:

// 构建活动实例时设置掩码
var maskActivity = new RegexMaskActivity();
maskActivity.RegexMask = @"^[A-Za-z0-9]{8}$";

这种场景下,包装属性里的SetValue是有效的,因为此时处于设计时或工作流实例准备阶段,还没进入运行时上下文托管的阶段。

4. 动态活动(DynamicActivity)的特殊处理

如果你用的是DynamicActivity,DP的定义和访问方式略有不同,需要通过DynamicActivity.Properties来声明,然后在执行逻辑里通过上下文获取:

// 定义动态DP
var regexMaskProp = new DynamicActivityProperty
{
    Name = "RegexMask",
    Type = typeof(InArgument<string>),
    Value = new InArgument<string>(@"^\d{4}$")
};

// 构建动态活动
var dynamicActivity = new DynamicActivity
{
    Properties = { regexMaskProp },
    Implementation = () => new WriteLine 
    { 
        Text = new InArgument<string>(ctx => ctx.GetValue(regexMaskProp)) 
    }
};

总结一下核心要点:

  • 活动执行逻辑里必须用上下文的GetValue/SetValue,别直接调用实例方法
  • DP注册要符合活动类的静态只读要求
  • 外部设置用包装属性完全没问题

内容的提问来源于stack exchange,提问作者MrSpudtastic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:37:37