سؤال

أنا أعمل على نظام يمكن للمستخدم تحرير الكائنات الموجودة ("تصفية" كائنات المجال على وجه الدقة) من خلال واجهة المستخدم الرسومية.مثل واجهة المستخدم التلميح ، نريد فقط أن تمكين زر حفظ إذا كان المستخدم حقا تعديل شيء إلى الكائن.أنا أتساءل عما إذا كان أي شخص لديه أي خبرة مع هذه المشكلة و ما أفضل طريقة ليكون هذا النهج.

كنت أفكر في إضافة isDirty() العلم إلى كائن المجال.عندما يبدأ مستخدم تحرير تصفية, ثم أود أن جعل نسخة ، تمريرها إلى واجهة المستخدم الرسومية تتيح للمستخدم إجراء تعديلات على النسخة.ملزم على isDirty() العلم ثم تمكين/تعطيل زر حفظ.على توفير الخلافات ثم دمج الكائن الأصلي ولا تزال مستمرة.

أديتيونالي ، كنت أفكر في ما سيحدث إذا كان المستخدم مكتب الإنمائي التغييرات التي قام بها كائن.على isDirty() علم أن ثم return false.لذا أعتقد أن السبيل الوحيد لتحقيق هذا هو الحفاظ على القيمة الأصلية من كل الممتلكات داخل كائن المجال.

أي أفكار ؟

هل كانت مفيدة؟

المحلول

وتصحيح!

وبالإضافة إلى ذلك، يمكن أن يعرض طريقتين: BeginEdit - في هذه الطريقة، العلامة الخاصة بك IsDirty العلم الخاص بك إلى True. وهذا يعني تقومون به التعديل. استدعاء هذا الأسلوب عندما كنت على وشك إجراء تعديلات

وCancelEdit - في هذه الطريقة، إعادة تعيين العلم IsDirty إلى خطأ. وهذا يعني أنك قد arborted عملية تحرير وعادت إلى حالتها الأصلية. استدعاء هذا الأسلوب عند إلغاء أي التعديلات التي أجرتها.

وبمجرد استمرت أي تعديلات، يمكنك أيضا إعادة تعيين العلم IsDirty إلى خطأ.

وآمل أن يساعد هذا.

نصائح أخرى

إذا كنت تستخدم صافي الإطار، قد ترغب في إلقاء نظرة على الإطار CSLA. NET التي كتبها روكفورد Lhotka: <لأ href = "http://www.lhotka.net/cslanet/Default.aspx" يختلط = "noreferrer نوفولو"> http://www.lhotka.net/cslanet/Default.aspx

وCSLA هو إطار ناضجة والذي يتضمن إدارة الدولة الكائن (IsDirty)، التراجع عن وظيفة، وربط البيانات والكثير، بالإضافة إلى أنه مجاني ومفتوح المصدر.

وهناك زوجين من الواجهات التي يمكن تنفيذ ذلك المساعدة في تعقب التغييرات والتراجع: INotifyPropertyChanged وIEditableObject. كل من هذه الواجهات تسمح للجسم للعب لطيفة مع ربط البيانات.

public class Person : INotifyPropertyChanged, IEditableObject
{
    private bool isDirty;

    public bool IsDirty
    {
        get { return isDirty; }
    }

    private string firstname = string.Empty;

    public string Firstname
    {
        get { return firstname; }
        set
        {
            if (firstname == value) return;
            firstname = value;
            NotifyPropertyChanged("Firstname");
        }
    }

    private string lastname = string.Empty;

    public string Lastname
    {
        get { return lastname; }
        set
        {
            if (lastname == value) return;
            lastname = value;
            NotifyPropertyChanged("Lastname");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void NotifyPropertyChanged(string propertyName)
    {
        isDirty = true;

        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    private bool inTrans;
    private Person copy;

    public void BeginEdit()
    {
        if (!inTrans)
        {
            if (copy == null)
                copy = new Person();

            copy.isDirty = isDirty;
            copy.Firstname = Firstname;
            copy.Lastname = Lastname;


            inTrans = true;
            isDirty = false;
        }
    }

    public void CancelEdit()
    {
        if (inTrans)
        {
            isDirty = copy.isDirty;
            Firstname = copy.Firstname;
            Lastname = copy.Lastname;

            inTrans = false;
        }
    }

    public void EndEdit()
    {
        if (inTrans)
        {
            copy = null;
            inTrans = false;
        }
    }
}

إذا كان لديك مجموعة من الكائنات التي يتم تحريرها ثم عليك ربما تحتاج إلى شيء أكثر من مجرد العلم منطقية لisDirty (). هذه المشكلة هي لا تختلف عن مرجع عد، أي زيادة في عدد القذرة على تحرير وإنقاص على التراجع. إذا كنت دعم التراجع وأظن أنت ذاهب لتصل الرياح مع بعض المنطق شعر جميلة. وأود أن يبقيه من كائنات المجال الخاص بك.

نعم، هذا يعمل بشكل جيد. بدلا من التراجع، واستخدام الأسلوب IsDirty للدلالة على أن شيئا ما قد تغير السجل ثم الذي يقوم بتشغيل بي "لم منطق التغيير السجل". أنا وضعت الإطار بلدي، حيث كل حقل جدول هو في الواقع خاصية كائن. تم تعيين كل مرة هو مكتوب حقل إلى الكائنات "isDirty" العلم. في طريقة "SaveObject" الكائن (في الواقع في فئة المساعد ولكن يمكن أن يكون بسهولة في الجسم، ولكن أردت القدرة على حفظ الأشياء بطرق مختلفة، مثل على XML، قاعدة البيانات، إلخ.)، أتحقق من IsDirty و إذا به كاذبة ثم أنا تخطي بالكرة. هذا يبسط المنطق كما في كل مرة كان لي إمكانية تغيير وجوه، وأدعو SaveObject والسماح للإطار التعامل معها.

واعتمادا على المجال الخاص بك، يمكنك استخدام المساواة لاختبار الفروق. الحفاظ على الكائن الأصلي وجعل نسخة من الكائن للتحرير. في أي وقت لتحرير ويمكن إجراء تعديل واجهة المستخدم بشكل مناسب.

والاستفادة من هذا الاقتراح هو أنه لا عصا واجهة المستخدم الرسومية وظائف محددة (العلم isDirty ()) على كائنات المجال الخاص بك، ولكن YMMV

إذا كنت دعم عملية التراجع في مستوى من الدقة أكبر من التراجع عن كل شيء منذ آخر حفظ' ثم أقترح التراجع المكدس.عندما يكون هناك شيء تحريرها ، (أو التراجع عن عملية functor أو مندوب) الحصول على إضافة إلى المكدس.عند التراجع ، يمكنك ببساطة البوب كومة التراجع عن العملية برزت.الخاص بك isDirty() العلم هو مجرد التحقق من إذا كان التراجع المكدس يحتوي على العناصر بدلا من تخزين إضافية والمنطق التحديث.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top