91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

WPF中如何使用CallerMemberName簡化InotifyPropertyChanged

發布時間:2022-06-20 15:21:09 來源:億速云 閱讀:159 作者:iii 欄目:開發技術

這篇文章主要介紹“WPF中如何使用CallerMemberName簡化InotifyPropertyChanged”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“WPF中如何使用CallerMemberName簡化InotifyPropertyChanged”文章能幫助大家解決問題。

在WPF中,當我們要使用MVVM的方式綁定一個普通對象的屬性時,界面上往往需要獲取到屬性變更的通知,

    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));
            }
        }
    }

這么做有一個比較大的隱患,那就是用了字符串的硬編碼的方式傳遞了屬性名稱,一旦拼寫錯誤或因為重構代碼忘記去更新這個字符串時,這樣就會導致界面上得不到更新。(本身硬編碼的方式來保證兩者的一致性就是不靠譜的行為)

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

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

    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));
            }
        }
    }

代碼很簡單,這里就不多介紹了。

更進一步

有的時候,為了減少通知的頻率,往往會把通知寫出如下形式:

    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();
        }
    }

這種寫法非常單調,并且在屬性多的時候代碼就顯得很累贅了。這里我就寫了一個通用點的函數把他們統一起來,下次就可以直接用了。

    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#的語法限制,不能在類外部調用event,因此不能寫成擴展方法,這里就簡單的寫成一個對象,下次就直接照著改好了:

    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簡化InotifyPropertyChanged”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

康保县| 宁都县| 泾阳县| 乌鲁木齐市| 弋阳县| 阜康市| 商都县| 肥东县| 安徽省| 铁力市| 通州市| 晋江市| 嵊州市| 宝山区| 朝阳市| 博客| 涪陵区| 枣庄市| 奉贤区| 葵青区| 吴忠市| 夹江县| 巴林左旗| 壤塘县| 普兰店市| 北碚区| 柳林县| 广州市| 邢台县| 海宁市| 来安县| 巨野县| 十堰市| 江津市| 邹平县| 新密市| 泰顺县| 环江| 治多县| 宾阳县| 太康县|