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

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

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

在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)致界面上得不到更新。(本身硬編碼的方式來(lái)保證兩者的一致性就是不靠譜的行為)

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

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

    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)一起來(lái),下次就可以直接用了。

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

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

相關(guān)文章

  • C# mysql 插入數(shù)據(jù),中文亂碼的解決方法

    C# mysql 插入數(shù)據(jù),中文亂碼的解決方法

    用C#操作mysql時(shí), 插入數(shù)據(jù)中文都是亂碼,只顯示問(wèn)號(hào),數(shù)據(jù)庫(kù)本身使用的是utf-8字符
    2013-10-10
  • c#判斷代碼是否執(zhí)行超時(shí)的幾種方式總結(jié)

    c#判斷代碼是否執(zhí)行超時(shí)的幾種方式總結(jié)

    這篇文章主要介紹了c#判斷代碼是否執(zhí)行超時(shí)的幾種方式總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • C#中WinForm控件的拖動(dòng)和縮放的實(shí)現(xiàn)代碼

    C#中WinForm控件的拖動(dòng)和縮放的實(shí)現(xiàn)代碼

    本篇文章主要介紹了C#中WinForm控件的拖動(dòng)和縮放的實(shí)現(xiàn)代碼,C# WinForm控件的拖動(dòng)和縮放是個(gè)很有用的功能,有興趣的可以了解一下。
    2017-01-01
  • C#中使用IFormattable實(shí)現(xiàn)自定義格式化字符串輸出示例

    C#中使用IFormattable實(shí)現(xiàn)自定義格式化字符串輸出示例

    這篇文章主要介紹了C#中使用IFormattable實(shí)現(xiàn)自定義格式字符串輸出示例,本文直接給出實(shí)例代碼,需要的朋友可以參考下
    2015-06-06
  • DataGridView控件顯示行號(hào)的正確代碼及分析

    DataGridView控件顯示行號(hào)的正確代碼及分析

    今天要用到DataGridView,想給它動(dòng)態(tài)的顯示行號(hào)。于是在網(wǎng)上找了一下解決方法。結(jié)果發(fā)現(xiàn)了不少問(wèn)題。然而就是這么一段有錯(cuò)的代碼,幾乎充斥著整個(gè)互聯(lián)網(wǎng),千篇一律的COPY,沒(méi)有一個(gè)人糾正
    2013-08-08
  • C#序列化與反序列化實(shí)例

    C#序列化與反序列化實(shí)例

    這篇文章主要介紹了C#序列化與反序列化的實(shí)現(xiàn)方法,實(shí)例分析了序列化與反序列化的原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-01-01
  • C#驗(yàn)證碼識(shí)別類完整實(shí)例

    C#驗(yàn)證碼識(shí)別類完整實(shí)例

    這篇文章主要介紹了C#驗(yàn)證碼識(shí)別類,以一個(gè)完整實(shí)例形式較為詳細(xì)的分析了驗(yàn)證碼圖片處理所涉及的各種常用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • 利用C#實(shí)現(xiàn)AOP常見的幾種方法詳解

    利用C#實(shí)現(xiàn)AOP常見的幾種方法詳解

    AOP面向切面編程(Aspect Oriented Programming),是通過(guò)預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。下面這篇文章主要給大家介紹了關(guān)于利用C#實(shí)現(xiàn)AOP常見的幾種方法,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-09-09
  • WinForm實(shí)現(xiàn)攔截窗體上各個(gè)部位的點(diǎn)擊特效實(shí)例

    WinForm實(shí)現(xiàn)攔截窗體上各個(gè)部位的點(diǎn)擊特效實(shí)例

    這篇文章主要介紹了WinForm實(shí)現(xiàn)攔截窗體上各個(gè)部位的點(diǎn)擊特效實(shí)例,對(duì)窗體上各個(gè)部位進(jìn)行定義,從而實(shí)現(xiàn)了點(diǎn)擊特效,需要的朋友可以參考下
    2014-09-09
  • c# 進(jìn)程內(nèi)部的同步

    c# 進(jìn)程內(nèi)部的同步

    這篇文章主要介紹了c# 進(jìn)程內(nèi)部的同步,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下
    2020-10-10

最新評(píng)論

盐源县| 五原县| 秦皇岛市| 新营市| 隆昌县| 大荔县| 子洲县| 论坛| 南川市| 荣成市| 马关县| 安福县| 屯留县| 阿瓦提县| 石楼县| 石首市| 自治县| 东明县| 遂昌县| 从江县| 鄂州市| 无锡市| 榆中县| 邓州市| 丹东市| 邹平县| 休宁县| 平江县| 南开区| 宜春市| 易门县| 焦作市| 丰台区| 钟山县| 涿州市| 普兰县| 全椒县| 冷水江市| 土默特左旗| 万安县| 五常市|