أحداث مقترنة بشكل فضفاض في WPF دون استخدام المنشور

StackOverflow https://stackoverflow.com/questions/224527

سؤال

أنا أعمل على تطبيق WPF وأستخدم نمط عرض النموذج-ViewModel.

يتكون التطبيق من وحدتين في الوقت الحالي:

  • اللوحة اليسرى لتصفح شجرة وحدد عقدة
  • اللوحة الرئيسية لإظهار محتوى عقدة الشجرة المحددة.

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

على النحو الأمثل ، أحب استخدام PRISM (إرشادات تطبيق WPF المركبة) ، لكنني أقوم حاليًا بتوسيع تطبيق موجود ولا يمكنني تقديم المزيد من التبعيات. المشروع أيضًا على .NET 3.0 (وليس 3.5) ، لذلك سأضطر إلى تحويل PRISM إلى .NET 3.0 كما هو مكتوب لـ .NET 3.5.

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

أستخدم الأوامر لتحقيق هذا الاقتران الفضفاض بين وجهة نظري و My ViewModel ، لكنني لست متأكدًا من كيفية القيام بالاتصالات المناسبة عبر العرض.

أي نصائح أو اقتراحات موضع تقدير كبير.

أنا أبحث على وجه التحديد عن حقًا طراز Light BUND/Sub Event Model ل .NET 2.0/3.0 (بدون أشياء LINQ) ، أو شيء آخر لتنفيذ اتصال العرض (الوحدة النمطية) دون اقتران الوحدات النمطية.

تحديث: انتهى بي الأمر في حل هذا بطريقة مماثلة لما يقترحه غلين. لديّ eventservice منفصل (أسميها commandproxy) ، وأمر هذا واحد إلى كل ViewModel من خلال المُنشئين في محدد موقع الخدمة الخاص بي (في الوقت الحالي ، أستخدم موقع خدمة بدلاً من iOC-container). يعرض CommandProxy مجموعة من MultiDelegateCommants ، وهو امتداد لل DegateCommand في Prism (إرشادات WPF المركبة). إنه يسمح بشكل أساسي بأوامر منفصلة عن الشجرة المرئية ، والتي تدعم العديد من المشتركين.

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

المحلول

هل لديك حاوية IOC؟ طريقة واحدة بسيطة هي إنشاء خدمة مخصصة تطلق الحدث. مجمع الأحداث عام ، ولكن يمكنك إنشاء خدمة محددة تقوم بما تريد.

على سبيل المثال ، قم بإنشاء eventingservice الذي يحتوي على طريقة OnnodeSelected. تطلق هذه الطريقة حدثًا تم اختياره والذي يتدلى من الخدمة. يتم تسجيل الخدمة بعد ذلك في حاوية IOC الخاصة بك مما يسمح للناشرين والمشتركين بالوصول إليها. وبهذه الطريقة ، إذا قيل أن MainPanel يحتاج إلى الاشتراك ، فسيتم حقن MainPanelViewModel الخاص بك مع Eventingserviec في مُنشئه. بعد ذلك سوف يشترك. هناك نهج آخر إذا كنت تستخدم WPF هو سحب compositeCommand من رمز مكتبة التطبيق المركب وتكشف خدمة الأحداث عن compositecmand. ثم يسجل كل مشترك (نموذج العرض) أمرهم مع الخدمة. عندما يتم استدعاء onnodeselected ، يتم استدعاء تنفيذ CompositeCommand ، وبالتالي إخطار جميع الأطراف المعنية.

نتحدث عن استخدام خدمتك الخاصة لهذا في مستندات إرشادات التطبيق المركب على www.microsoft.com/compositewpf في القسم الخاص بالأحداث المزدوجة في موضوع الاتصالات. ((http://msdn.microsoft.com/en-us/library/cc707836.aspx). فرانسيس تشيونغ لديه أيضا منشور حول هذا.

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