属性调用方法或触发事件是否“错误”?

4
命名规范意味着(通常)属性是名词,方法是动词。现在,我知道这些只是指南而不是规则,但最好在能够遵循指南时遵循它们。
这意味着以下内容:
Person.Name = "Dave";

只应设置名称属性。我不希望该属性看起来像

public string Name
{ 
    set
      { 
          UpdateDatabase(value);
      }
}

我的问题与上面的例子非常相似,但涉及到DependencyProperties。
我的应用程序有一个UserControl,它看起来像这样:
 <uc:MyControl MyControlMyValue="{Binding RelativeSource={RelativeSource AncestorType=userControls:MyOtherControl}, Path=MyValue, Mode=OneWayToSource}" />

如上所述,当更新MyControlMyValue属性时,它会更新MyValue属性。我的问题是,当更新此属性时,我需要执行比简单绑定更多的逻辑!

目前,我打算忽略指南并实现类似以下内容的东西

    private double _myValue;
    public double MyValue
    {
        get { return __myValue; }
        set
        {
            if (value == __myValue)
                return;

            __myValue= value;
            LookAtMeHiddenAway();
            OnPropertyChanged("MyValue");
        }
    }

有更好的方法吗?这种感觉对我来说很不舒服。

读取属性应该很快。但是写入呢?当您设置它时,会引发事件,因此任意代码都可以运行。如果无论如何都是这种情况,那么有什么阻止您调用方法呢? - Kris Vandermotten
是的,@Kris,你说得对,但这个含义是由微软设计的,出于某种原因,我觉得它是唯一的例外... 我还是新手(编程)所以指南对我很重要。 - Dave
1
请注意,当绑定更新时,您类中的DependencyProperty设置器/获取器不会被调用。绑定系统在低级别处理此操作,因此您期望在设置器/获取器中运行的任何代码都不会被调用。 - user1228
2个回答

6
好的,这取决于情况。如果我们谈论一般的编程准则,我会说不要在属性内调用方法。因为当我们使用属性(读/写)时,我和其他人都期望存储和检索数据。所以如果你要“改变”什么东西,通过调用一个方法来实现,这个方法可以通过声明来表明它的行为。
但是在WPF中,这是预期的行为。所以在WPF的属性中适合更改数据,并且希望以这种方式进行操作。
总之:对主题没有强制限制,但这是基于代码在特定环境中的预期行为的“建议准则”。

啊,所以这就是WinForms的人看着我像是犯了致命的罪孽,当我建议这个时!所以,在这些情况下,在属性内部有方法是可以预期(被接受的)。谢谢。 - Dave
1
@DaveRook:就 WPF 而言,是的。因为我们绑定了一个属性,并期望它会改变 ModelView 中的某些内容(如果它不是只读的话)。 - Tigran
@DaveRook:是的,对于WindowsForms来说这不是一个好主意,但是如果你真的需要那么没有人可以限制它。那些只是指南。 - Tigran

4
我会创建一个名为OnMyValueChanged的事件,当属性值改变时,需要更新的任何内容都将注册处理程序到该事件。或者处理PropertyChanged事件。这其实是相同的事情,但它避免了将与属性不直接相关的逻辑(例如限制值)放在setter中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接