سؤال

أنا في موقف حيث يتم إبلاغي من مصدر خارجي بأن كيانًا معينًا قد تم تغييره خارج سياق البيانات الحالي الخاص بي.أنا قادر على العثور على الكيان وتحديث الاتصال بهذه الطريقة

MyDataContext.Refresh(RefreshMode.OverwriteCurrentValues, myEntity);

ويتم تحديث الخصائص التي تم تغييرها في الكيان بشكل صحيح.ومع ذلك، لا يبدو أن أيًا من INotifyPropertyChanging INotifyPropertyChanged قد تم رفعه عند حدوث التحديث وهذا يترك واجهة المستخدم الخاصة بي تعرض معلومات غير صحيحة.

أدرك أن Refresh() يفشل في استخدام حروف الملكية والمحددات الصحيحة في الكيان لرفع أحداث إشعار التغيير، ولكن ربما تكون هناك طريقة أخرى لإنجاز نفس الشيء؟

أفعل شيئا خاطئا؟هل هناك طريقة أفضل من التحديث؟إذا كان التحديث هو الخيار الوحيد، فهل لدى أي شخص حل بديل؟

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

المحلول

كان لي مشكلة مشابهة.لقد كنت مرتبطًا بـ TreeView وأحتاج إلى الاتصال بالتحديث ردًا على قيام المستخدم بإلغاء عملية التحرير.ال Refresh() تقوم الطريقة بإطاعة إعادة كافة القيم الأصلية، لكن هذا لم ينعكس في واجهة مستخدم TreeView الخاصة بي.وبعد استشارة جوجل القدير توصلت إلى هذا الحل:

CollectionViewSource.GetDefaultView(treeViewClusters.ItemsSource).Refresh();

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

فهل هناك حل أفضل من هذا؟

تم التعديل:نعم هنالك...

توصل أحد زملائي في العمل الأكثر ذكاءً مني إلى هذا الحل، والذي يبدو أنه يفي بالغرض.في الفصل الجزئي الخاص بك لكائن Linq2Sql، أضف التعليمة البرمجية التالية:

public void SendPropertiesChanged()
{
     foreach (System.Reflection.PropertyInfo prop in this.GetType().GetProperties())
     SendPropertyChanged(prop.Name);
}

يمكنك فقط استدعاء هذا في رمز التطبيق الخاص بك:

context.Refresh(RefreshMode.OverwriteCurrentValues, employee);
employee.SendPropertiesChanged();

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

نصائح أخرى

إذا كنت تعرف لدعوة التجديد ()، لماذا لا فقط على المضي قدما وتحديث واجهة المستخدم في هذه النقطة على أية حال؟

ويتم استدعاء PropertyChanging وPropertyChanged من خلال التذرع واضع على فئة كيان ولدت DBML-LINQtoSQL. داعيا تجديد () لا تفعل ما يلي:

[Column(Storage="_DisplayName", DbType="VarChar(50) NOT NULL", CanBeNull=false)]
public string DisplayName
{
    get
    {
        return this._DisplayName;
    }
    set
    {
        if ((this._DisplayName != value))
        {
            this.OnDisplayNameChanging(value);
            this.SendPropertyChanging();
            this._DisplayName = value;
            this.SendPropertyChanged("DisplayName");
            this.OnDisplayNameChanged();
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top