溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

WPF中怎么使用CallerMemberName簡(jiǎn)化InotifyPropertyChanged

發(fā)布時(shí)間:2022-10-21 10:00:32 來源:億速云 閱讀:130 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“WPF中怎么使用CallerMemberName簡(jiǎn)化InotifyPropertyChanged”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“WPF中怎么使用CallerMemberName簡(jiǎn)化InotifyPropertyChanged”吧!

在WPF中,當(dāng)我們要使用MVVM的方式綁定一個(gè)普通對(duì)象的屬性時(shí),界面上往往需要獲取到屬性變更的通知,

    class NotifyObject : INotifyPropertyChanged
    {
        private int number;
        public int Number
        {
            get { return number; }
            set { number = value; OnPropertyChanged("Number"); }
        }

        private string text;
        public string Text
        {
            get { return text; }
            set { text = value; OnPropertyChanged("Text"); }
        }


        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string propertyName = "")
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

這么做有一個(gè)比較大的隱患,那就是用了字符串的硬編碼的方式傳遞了屬性名稱,一旦拼寫錯(cuò)誤或因?yàn)橹貥?gòu)代碼忘記去更新這個(gè)字符串時(shí),這樣就會(huì)導(dǎo)致界面上得不到更新。(本身硬編碼的方式來保證兩者的一致性就是不靠譜的行為)

雖然這本身并不是問題,但卻不是很好的實(shí)踐。也有人通過一些手段來解決這個(gè)問題,有的是通過表達(dá)式樹,還有的通過Attribute注入的方式。

從性能上來講,注入是一個(gè)比較好的方式,但往往引入了比較復(fù)雜的框架。實(shí)際上,在C# 5.0中就引入了一個(gè)調(diào)用方信息的語(yǔ)法方便我們獲取調(diào)用方的函數(shù)名稱和位置,通過它可以非常簡(jiǎn)單快捷的解決上面的這個(gè)問題:

    class NotifyObject : INotifyPropertyChanged
    {
        private int number;
        public int Number
        {
            get { return number; }
            set { number = value; OnPropertyChanged(); }
        }

        private string text;
        public string Text
        {
            get { return text; }
            set { text = value; OnPropertyChanged(); }
        }


        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged([CallerMemberName]string propertyName = "")
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

代碼很簡(jiǎn)單,這里就不多介紹了。

更進(jìn)一步

有的時(shí)候,為了減少通知的頻率,往往會(huì)把通知寫出如下形式:

    private int number;
    public int Number
    {
        get { return number; }
        set
        {
            if (number == value)
                return;

            number = value;
            OnPropertyChanged();
        }
    }

    private string text;
    public string Text
    {
        get { return text; }
        set
        {
            if (text == value)
                return;

            text = value;
            OnPropertyChanged();
        }
    }

這種寫法非常單調(diào),并且在屬性多的時(shí)候代碼就顯得很累贅了。這里我就寫了一個(gè)通用點(diǎn)的函數(shù)把他們統(tǒng)一起來,下次就可以直接用了。

    private int number;
    public int Number
    {
        get { return number; }
        set { UpdateProper(ref number, value); }
    }

    private string text;
    public string Text
    {
        get { return text; }
        set { UpdateProper(ref text, value); }
    }

    protected void UpdateProper<T>(ref T properValue, T newValue, [CallerMemberName] string properName = "")
    {
        if (object.Equals(properValue, newValue))
            return;

        properValue = newValue;
        OnPropertyChanged(properName);
    }

由于C#的語(yǔ)法限制,不能在類外部調(diào)用event,因此不能寫成擴(kuò)展方法,這里就簡(jiǎn)單的寫成一個(gè)對(duì)象,下次就直接照著改好了:

    class NotifyObject : INotifyPropertyChanged
    {
        private int number;
        public int Number
        {
            get { return number; }
            set { UpdateProper(ref number, value); }
        }

        private string text;
        public string Text
        {
            get { return text; }
            set { UpdateProper(ref text, value); }
        }

        protected void UpdateProper<T>(ref T properValue, T newValue, [CallerMemberName] string properName = "")
        {
            if (object.Equals(properValue, newValue))
                return;

            properValue = newValue;
            OnPropertyChanged(properName);
        }

        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged([CallerMemberName]string propertyName = "")
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

感謝各位的閱讀,以上就是“WPF中怎么使用CallerMemberName簡(jiǎn)化InotifyPropertyChanged”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)WPF中怎么使用CallerMemberName簡(jiǎn)化InotifyPropertyChanged這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI