如何访问c#属性的方法?(特别是如果属性是一个集合并使用INotifyPropertyChanged接口)

本文关键字:属性 集合 合并 一个 接口 INotifyPropertyChanged 特别是 访问 何访问 方法 如果 | 更新日期: 2023-09-27 17:59:50

假设我们有List类型的SomeProperty,我们已经获取并设置了的方法

public List<SomeClass> SomeProperty
{
    get
    {
        //return something
    }
    set
    {
        //set something
    }
}

我想知道当调用SomeProperty(即SomeProperty.Add(someObject);)的方法时,是否调用get或set方法。

我想知道,因为我有一个wpf窗口,它有一个List作为Property(让我们称之为ListProperty),需要使用INotifyPropertyChanged的实现方法更新另一个显示属性(让我们将其称为DisplayProperty)。我想知道我是否应该将OnPropertyChanged事件放入get或set

即:

public List<SomeClass> ListProperty
{
    get
    {
        //return something
    }
    set
    {
        OnPropertyChanged("DisplayProperty");
    }
}

还是有更好的解决方案来实现这种效果?

如何访问c#属性的方法?(特别是如果属性是一个集合并使用INotifyPropertyChanged接口)

否,任何修改集合的操作都不会调用setter。ObservableCollection类是为这个特定目的而存在的——您可以在列表的位置使用它。您仍然应该使用INotifyPropertyChanged,并将其作为具有更改通知的属性,这样,如果整个集合被替换,则其事件将激发。

编辑,示例:

public ObservableCollection<SomeClass> SomeProperty
{
    get
    {
        return _someProperty;
    }
    set
    {
        if (_someProperty == value) return;
        _someProperty = value;
        OnPropertyChanged("SomeProperty");
    }
}

当您编写SomeProperty.Add(someObject);时,您调用的是getter,而不是setter。然后你改变了getter返回的属性。

在多个级别上通知getter中的属性更改都是错误的。首先,在实际层面上,在返回值之后,您将更改属性返回的值,因此属性更改事件将在更改之前触发。其次,对于代码的消费者来说,仅仅因为获得了属性的值就期望触发属性更改事件是非常令人困惑的。

如果您想知道此集合的值是否发生了变化,而不仅仅是知道属性引用的集合是否发生了更改,则应该使用特定的集合类型,以便在更改时进行观察,例如ObservableCollection

正如前面提到的所有其他答案一样,我将List切换到ObservableCollection,但也将Add方法(ListProperty.Add(someObject))封装到另一个方法中,并从该方法调用OnPropertyChanged('DisplayProperty')

代码:

public ObservableCollection<SomeClass> ListProperty
{
    get
    {
        //return something
    }
    set
    {
        //set something
        OnPropertyChanged('ListProperty')
    }
}
public SomeClass DisplayProperty
{
    get
    {
        //returns something involving ListProperty
    }
    set
    {
        //set something
        OnPropertyChanged("DisplayProperty");
    }
}
private void AddSomeItem(SomeClass item)
{
    //any extra code
    ListProperty.Add(item);
    OnPropertyChanged("DisplayProperty");
}