【问题标题】:Why does this method return a boolean?为什么这个方法返回一个布尔值?
【发布时间】:2020-06-15 10:33:59
【问题描述】:

为什么从 SetProperty 返回 bool?它没有被使用。

这是来自 Xamarin.Forms 模板的样板代码。

它也不用于继承类。


public class BaseViewModel : INotifyPropertyChanged
{
    private bool isBusy = false;
    public bool IsBusy
    {
        get { return isBusy; }
        set { SetProperty(ref isBusy, value); }
    }

    protected bool SetProperty<T>(ref T backingStore,
                                  T value,
                                  [CallerMemberName] string propertyName = "",
                                  Action onChanged = null)
    {
        if (EqualityComparer<T>.Default.Equals (backingStore, value))
            return false;

        backingStore = value;
        onChanged?.Invoke();
        OnPropertyChanged(propertyName);
        return true;
    }

    #region INotifyPropertyChanged
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        var changed = PropertyChanged;
        if (changed == null)
            return;

        changed.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion
}

【问题讨论】:

  • 在属性的 setter 中写入 if (SetProperty(ref backingStore, value)) { OnPropertyChanged(nameof(OtherProperty)); } 之类的内容有时很有用。这确保了OtherProperty 的额外通知仅在该属性实际发生更改时才会引发
  • 对不起,我应该把全班都贴出来的:
  • 这不会改变我所说的
  • 不。检查属性的值是否从其设置器更改仍然很有用,一个很好的方法是从SetProperty 返回这样的布尔值。您没有碰巧发现有人这样做并不意味着 没有人 这样做。
  • 请发布答案,而不是 cmets。评论是为了要求澄清,答案是为了……嗯,答案。

标签: c# inotifypropertychanged


【解决方案1】:

这个SetProperty 方法的返回值表明它是否有效地改变了它的底层支持字段。

IsBusy 实现不使用SetProperty 的返回值,但在可以访问此受保护的 SetProperty 方法的派生类中,其返回值可用于执行额外的专门任务。

顺便说一句,我实际上没想到BaseViewModel 类有一个带有公共设置器的IsBusy 属性。就像现在一样,外界可以确定BaseViewModel 实例是否忙。在我看来,这有点奇怪。

【讨论】:

    猜你喜欢
    • 2015-02-15
    • 2014-03-20
    • 2019-07-23
    • 2012-08-27
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    相关资源
    最近更新 更多