如何在C#属性的setter中触发OnTrendPointChanged变更事件
实现方案
你需要先在类中声明对应事件,再在属性setter中值变更时主动触发事件,以下是修正后的完整可运行代码:
public class TestClass:ObservablePoint { // 如需对外暴露事件供外部订阅可保留此行,不需要可删除 public event EventHandler<ValueChangedEventArgs<string>> TrendPointChanged; private ITrendPoint trendPoint; public ITrendPoint TrendPoint{ get{ return trendPoint ;} set{ // 新旧值一致时不触发,避免无效执行 if(trendPoint == value) return; this.trendPoint= value; // 触发事件,注意需将ITrendPoint对应的字符串值传入参数 // 此处假设你的ITrendPoint有一个名为Value的string类型属性,按需替换为你实际的字段/属性名 OnTrendPointChanged(this, new ValueChangedEventArgs<string>(trendPoint.Value)); } } public void TestJob() { TrendPoint= Services.getTrendPoint(); } private void OnTrendPointChanged(object sender, ValueChangedEventArgs<string> e) { // 如不需要对外暴露事件可删除下一行 TrendPointChanged?.Invoke(sender, e); // 业务逻辑 switch(e.Value) { case "HIGH": Log("TR HIGH"); break; case "Low": Log("TR LOW"); break; // 其他自定义条件 } } }
关键说明
- 如果你不需要对外暴露事件供外部订阅,可以删掉声明的
TrendPointChanged事件和对应的Invoke代码,直接在属性setter中调用OnTrendPointChanged方法即可 - 原代码中的switch存在语法错误,C#中switch需要用大括号包裹,每个case分支必须加break/return等跳出语句,否则会出现编译错误
- 如果你继承的
ObservablePoint已经内置了INotifyPropertyChanged属性变更通知机制,也可以通过订阅PropertyChanged事件判断变更的属性是否为TrendPoint来执行对应逻辑,自定义事件的方式更直观高效
内容的提问来源于stack exchange,提问作者Artemis
相关产品推荐
相关产品推荐

