【问题标题】:Could there be any possible issues with this ViewModel?这个 ViewModel 可能有任何问题吗?
【发布时间】:2020-05-04 16:46:11
【问题描述】:

下面的 ViewModel 是否有任何可能的错误? 换句话说,代码中是否有任何部分可能会产生任何问题? 请指教。 谢谢。

public class MyViewModel : INotifyPropertyChanged
{
    private string _text;

    public string Text
    {
        get { return _text; }
        set
        {
            if (Equals(_text, value))
                return;
            _text = value;
            OnPropertyChanged(nameof(Text));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        if(PropertyChanged!=null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

【问题讨论】:

  • 您是否在使用此虚拟机时遇到任何问题,或者在有人审查您的代码后遇到问题?
  • 看起来不错,更短的方式可以保护 virtual void OnPropertyChanged([CallerMemberName]string propertyName = "") { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); }

标签: c# .net oop mvvm


【解决方案1】:

如果从不同的线程调用OnPropertyChanged 方法,您可能会遇到一些线程问题。如果在另一个线程上并行发生任何 PropertyChanged 事件取消订阅,您可能最终会抛出 NullReferenceException。当您最初检查PropertyChanged 是否不为空时,它可能会显示为真,但当您尝试调用处理程序时,下一行可能为空。因此,正确和推荐的方法如下所示。您还可以通过将[CallerMemberNameAttribute] 添加到propertyName 参数来增强该方法,以避免在传递propertyName 的值时出现拼写错误。使用为参数指定的属性,您不必为正在更改的属性传递属性名称。您只需要调用不带参数的方法,属性将负责传递适当的属性名称值。

protected virtual void OnPropertyChanged([CallerMemberName]string propertyName=null)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多