最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

WPF中使用CallerMemberName簡化InotifyPropertyChanged的實(shí)現(xiàn)

 更新時間:2022年06月20日 11:56:05   作者:天方  
這篇文章介紹了WPF中使用CallerMemberName簡化InotifyPropertyChanged的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

在WPF中,當(dāng)我們要使用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));
            }
        }
    }

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

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

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

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

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

更進(jìn)一步

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

    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),并且在屬性多的時候代碼就顯得很累贅了。這里我就寫了一個通用點(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#的語法限制,不能在類外部調(diào)用event,因此不能寫成擴(kuò)展方法,這里就簡單的寫成一個對象,下次就直接照著改好了:

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

到此這篇關(guān)于WPF中使用CallerMemberName簡化InotifyPropertyChanged的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

荆门市| 太原市| 盘锦市| 安吉县| 屏东县| 澄迈县| 嘉峪关市| 图片| 商丘市| 麟游县| 凌云县| 昂仁县| 雷山县| 教育| 广宁县| 雅安市| 城市| 西和县| 抚顺县| 云林县| 湘西| 库尔勒市| 合肥市| 新疆| 墨竹工卡县| 咸宁市| 翁牛特旗| 津南区| 西平县| 张家川| 江陵县| 神农架林区| 上林县| 同心县| 淳化县| 灵璧县| 九龙县| 黄冈市| 信宜市| 信宜市| 当涂县|