سؤال

طيب حتى أنا أريد فرعية ObservableCollection لإضافة موقع إلى ذلك.للأسف PropertyChanged الحدث محمي.أساسا أنا أريد أن فئة فرعية من ذلك ان SelectedItem أنه لا يمكن ربط لقوائم في MVVM WPF التطبيق.

هنا العظمي صفي:

public class SelectableList<T> : ObservableCollection<T>
{
    public T SelectedItem {get;set;}
}

ولكن أنا لا يمكن أن تفعل ما يلي:

SelectableList<int> intList = new SelectableList<int>();
intList.PropertyChanged += new PropertyChangedEventHandler(intList_Changed);

بسبب القيود المفروضة على الوصول.وهذا يسبب لي أن أسأل سؤال أعمق.كيف واجهة المستخدم يمكن الحصول على إخطار من PropertyChanged الأحداث(مثلا ، عد الملكية) وأنا لا يمكن أن تفعل ذلك في التعليمات البرمجية-خلف?

رأسي هو الغزل ، يمكن للشخص يرجى تنوير لي ؟

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

المحلول

SelectableList<int> intList = new SelectableList<int>();
((INotifyPropertyChanged)intList).PropertyChanged += 
    new PropertyChangedEventHandler(intList_Changed);

تنفذ INotifyPropertyChanged صراحة ، مما يعني أنك يجب أن يلقي سبيل المثال إلى الواجهة قبل أن تتمكن من الوصول إلى أساليب واجهة، وخصائص والأحداث. لماذا يتم ذلك، وأنا لا أعرف. و ربط العلامات extensio ن لا " أعرف "ObservableCollections أو أي نوع آخر. فإنه يتحقق أنواع لمعرفة ما اذا كان تنفيذ أو توسيع واجهات محددة / فئات أساسية (INPC، INCC، DependencyObject، الخ) وذلك لا يهمني إذا تم تطبيق الواجهة بشكل صريح.

نصائح أخرى

ObservableCollection (int .NET framework 3.5) يظهر لتنفيذ PropertyChanged الحدث في طريقة مثيرة للاهتمام.

protected event PropertyChangedEventHandler PropertyChanged;

event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged;

وهذا يعني أن المحمية PropertyChanged الحدث هو أن من المفترض أن يتم استخدامها من أجل تنفيذ الداخلي.أخرى INotifyPropertyChanged.PropertyChanged الحدث هو الذي في الواقع يحقق تنفيذ INotifyPropertyChanged واجهة باعتبارها صريحة واجهة.الغريب أنني لا أرى أي مكان داخل ObservableCollection حيث INotifyPropertyChanged.PropertyChanged هو في الواقع المطروحة.هذا قد يكون إشارة إلى أن هذا كان خطأ في .NET framework 3.5 على الرغم من أنني لم تختبر لتأكيد ما إذا كان على سبيل المثال خاصية تغيير الحدث هو رفع عن العد عند إضافة عنصر إلى مجموعة ولكن الذي يظهر كيف أنه من المفترض أن يعمل.

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

تصحيح: يجب التحقق من أن INotifyPropertyChanged.PropertyChanged الحدث أثار ObservableCollection حتى الافتراضات جعلت أعلاه على أساس النتائج من استخدام عاكس للنظر في ObservableCollection التنفيذ يجب أن تكون غير دقيقة.تخميني هو أن عاكس يفعل شيئا خطأ غريب ليس لدي أي دليل على ذلك حتى الآن.

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

SelectableList<int> intList = new SelectableList<int>();
((INotifyPropertyChanged)intList).PropertyChanged += 
    new PropertyChangedEventHandler(intList_Changed);

مثيرة للاهتمام صحيح ؟ باستخدام صريحة واجهات وهي تستخدم أساسا لا مفر منه لتجنب التصادم في أعضاء المطلوبة معين واجهة ولكن يمكن استخدامها بمعنى إخفاء وجود الأعضاء.

إذا كنت ترغب في رفع خاصية تغيير الأحداث الخاصة بك الخصائص المخصصة التي يمكنك إدخال في فرعية الخاص بك تبدو في الغالب و/أو الدعوة المحمية OnPropertyChanged طريقة ObservableCollection كما تنفذ.هذا الأسلوب هو جيد اعتمد معيار يسمح فرعية لرفع الأحداث أو التعامل مع الأحداث من دون الوصول إلى الحدث الأساسي مندوب.هو عموما يفضل استخدام هذه التقنية أيضا بالمناسبة بدلا من وجود فئة فرعية هوك معالجات الأحداث إلى أنها تملك قاعدة فئات الأحداث.لمزيد من الأمثلة أنظر كيف الأحداث في مختلف الضوابط يتم تنفيذها في WinForms و WPF.

حاولت إضافة خاصية جديدة في

public class ResultCollection<T> : ObservableCollection<T>
{

        Boolean _val;
        public Boolean Val
        {   
            get
            {   
                return _val;
            }
            set
            {   
                _val= value;
                OnPropertyChanged(new PropertyChangedEventArgs("Val"));
            }
        }
}

أنا حقا لم تلاحظ ذلك PropertyChanged ويعرف المحمية.انتقلت أخيرا فال الملكية ViewModel.

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

FWIW, أعتقد أنك من الأفضل ترك ObservableCollection وحده فقط إضافة خاصية أخرى إلى الجهاز الظاهري الخاص بك.

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