第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使數(shù)據(jù)綁定類型安全并支持重構(gòu)

如何使數(shù)據(jù)綁定類型安全并支持重構(gòu)

RISEBY 2019-10-05 13:47:16
當(dāng)我希望將控件綁定到對象的屬性時,必須提供屬性的名稱作為字符串。這不是很好,因為:如果該屬性被刪除或重命名,則不會收到編譯器警告。如果使用重構(gòu)工具重命名該屬性,則很可能不會更新數(shù)據(jù)綁定。如果屬性的類型錯誤,直到運行時我都不會出錯,例如,將整數(shù)綁定到日期選擇器。是否有一種設(shè)計模式可以解決此問題,但仍易于使用數(shù)據(jù)綁定?(這是WinForm,Asp.net和WPF以及大多數(shù)其他系統(tǒng)中的問題)現(xiàn)在,我發(fā)現(xiàn)“ C#中的nameof()運算符的變通辦法:typesafe數(shù)據(jù)綁定 ”也為解決方案提供了良好的起點。如果您愿意在編譯代碼后使用后處理器,那么notifypropertyweaver非常值得研究。當(dāng)用XML而不是C#進行綁定時,有人知道WPF的一個好的解決方案嗎?
查看完整描述

3 回答

?
largeQ

TA貢獻2039條經(jīng)驗 獲得超8個贊

感謝Oliver讓我入門,現(xiàn)在我有了一個既支持重構(gòu)又是類型安全的解決方案。它也讓我實現(xiàn)INotifyPropertyChanged,以便處理重命名的屬性。


它的用法如下:


checkBoxCanEdit.Bind(c => c.Checked, person, p => p.UserCanEdit);

textBoxName.BindEnabled(person, p => p.UserCanEdit);

checkBoxEmployed.BindEnabled(person, p => p.UserCanEdit);

trackBarAge.BindEnabled(person, p => p.UserCanEdit);


textBoxName.Bind(c => c.Text, person, d => d.Name);

checkBoxEmployed.Bind(c => c.Checked, person, d => d.Employed);

trackBarAge.Bind(c => c.Value, person, d => d.Age);


labelName.BindLabelText(person, p => p.Name);

labelEmployed.BindLabelText(person, p => p.Employed);

labelAge.BindLabelText(person, p => p.Age);

person類顯示了如何以一種類型安全的方式實現(xiàn)INotifyPropertyChanged(或參見以下答案以實現(xiàn)實現(xiàn)INotifyPropertyChanged的另一種相當(dāng)不錯的方法,ActiveSharp-自動INotifyPropertyChanged也看起來不錯):


public class Person : INotifyPropertyChanged

{

   private bool _employed;

   public bool Employed

   {

      get { return _employed; }

      set

      {

         _employed = value;

         OnPropertyChanged(() => c.Employed);

      }

   }


   // etc


   private void OnPropertyChanged(Expression<Func<object>> property)

   {

      if (PropertyChanged != null)

      {

         PropertyChanged(this, 

             new PropertyChangedEventArgs(BindingHelper.Name(property)));

      }

   }


   public event PropertyChangedEventHandler PropertyChanged;

}

WinForms綁定幫助程序類包含了使它們?nèi)抗ぷ鞯幕A(chǔ):


namespace TypeSafeBinding

{

    public static class BindingHelper

    {

        private static string GetMemberName(Expression expression)

        {

            // The nameof operator was implemented in C# 6.0 with .NET 4.6

            // and VS2015 in July 2015. 

            // The following is still valid for C# < 6.0


            switch (expression.NodeType)

            {

                case ExpressionType.MemberAccess:

                    var memberExpression = (MemberExpression) expression;

                    var supername = GetMemberName(memberExpression.Expression);

                    if (String.IsNullOrEmpty(supername)) return memberExpression.Member.Name;

                    return String.Concat(supername, '.', memberExpression.Member.Name);

                case ExpressionType.Call:

                    var callExpression = (MethodCallExpression) expression;

                    return callExpression.Method.Name;

                case ExpressionType.Convert:

                    var unaryExpression = (UnaryExpression) expression;

                    return GetMemberName(unaryExpression.Operand);

                case ExpressionType.Parameter:

                case ExpressionType.Constant: //Change

                    return String.Empty;

                default:

                    throw new ArgumentException("The expression is not a member access or method call expression");

            }

        }


        public static string Name<T, T2>(Expression<Func<T, T2>> expression)

        {

            return GetMemberName(expression.Body);

        }


        //NEW

        public static string Name<T>(Expression<Func<T>> expression)

        {

           return GetMemberName(expression.Body);

        }


        public static void Bind<TC, TD, TP>(this TC control, Expression<Func<TC, TP>> controlProperty, TD dataSource, Expression<Func<TD, TP>> dataMember) where TC : Control

        {

            control.DataBindings.Add(Name(controlProperty), dataSource, Name(dataMember));

        }


        public static void BindLabelText<T>(this Label control, T dataObject, Expression<Func<T, object>> dataMember)

        {

            // as this is way one any type of property is ok

            control.DataBindings.Add("Text", dataObject, Name(dataMember));

        }


        public static void BindEnabled<T>(this Control control, T dataObject, Expression<Func<T, bool>> dataMember)

        {       

           control.Bind(c => c.Enabled, dataObject, dataMember);

        }

    }

}

這利用了C#3.5中的許多新內(nèi)容,并顯示了可能的結(jié)果?,F(xiàn)在,如果只有衛(wèi)生宏,那么 Lisp程序員可能會停止稱我們?yōu)槎裙瘢?/p>


查看完整回答
反對 回復(fù) 2019-10-05
?
天涯盡頭無女友

TA貢獻1831條經(jīng)驗 獲得超9個贊

Framework 4.5為我們提供了CallerMemberNameAttribute,從而無需將屬性名稱作為字符串傳遞:


private string m_myProperty;

public string MyProperty

{

    get { return m_myProperty; }

    set

    {

        m_myProperty = value;

        OnPropertyChanged();

    }

}


private void OnPropertyChanged([CallerMemberName] string propertyName = "none passed")

{

    // ... do stuff here ...

}

如果您正在使用安裝了KB2468871的 Framework 4.0進行操作,則可以通過nuget來安裝Microsoft BCL兼容性包,該包也提供了此屬性。


查看完整回答
反對 回復(fù) 2019-10-05
  • 3 回答
  • 0 關(guān)注
  • 406 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號