Могут ли быть какие-либо возможные проблемы с этой ViewModel? - PullRequest
0 голосов
/ 04 мая 2020

Есть ли возможные ошибки с 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));
    }
}

1 Ответ

1 голос
/ 04 мая 2020

У вас могут возникнуть проблемы с многопоточностью, если метод OnPropertyChanged вызывается из разных потоков. Возможно, в конечном итоге выдается NullReferenceException, если в другом потоке параллельно происходит какое-либо отписывание от события PropertyChanged. Когда вы изначально проверяете PropertyChanged на «не ноль», это может выглядеть как «истина», но следующая строка, когда вы пытаетесь вызвать обработчик, может быть «ноль». Так что правильный и рекомендуемый способ сделать это показан ниже. Также Вы можете усовершенствовать метод, добавив [CallerMemberNameAttribute] к аргументу propertyName, чтобы избежать опечаток при передаче значения для propertyName. С атрибутом, указанным в аргументе, вам не нужно передавать имя свойства для изменяемого свойства. Вам просто нужно вызвать метод без аргументов, и атрибут позаботится о передаче соответствующего значения имени свойства.

protected virtual void OnPropertyChanged([CallerMemberName]string propertyName=null)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...