سؤال

في أداة DSL المخصصة الخاصة بي، أريد عقدة في Explorer التي لا يمكن إزالتها. بخلاف ذلك، أريد أن تكون مثل عقدة منتظمة. أساسا ما أريد هو عقدة مثل سلوك التسلسل XML. في DSL Explorer:

XML سلوك سلوك سلوك سياق التوضيح http://img31.imageshack.us/img31/740/xmlserializerbehavior.png

من خلال استخدام العاكس على فئة XMLSerializationDeFinitionSerializerIverizer في الجمعية Microsoft.visualstudio.modeling.sdk.sdeling.dll لقد اكتشفت أنه مجرد مشتق من domainclass، لذلك لا يوجد شيء (من الواضح) الخاص عن ذلك.

لقد حددت domansclass domansclass التي تعمل كعقدة، والنقر بزر الماوس الأيمن، وتتيح لي إضافة العقد الفرعية فقط بالطريقة التي أريدها أن تعمل، إلا أنني لا أستطيع التخلص من اختيار القائمة الحذف:

حذف قائمة السياق Item Itlication Http://img705.imageshack.us/img705/903/validators.png

لقد جربت أي شيء يمكنني التفكير فيه ... لقد قمت بتعيين STERTER الخاصية إلى القطاع الخاص، فهذا، فقد قمت بتعيين التعدد 1..1، ليس له تأثير آخر غير إعطاء أخطاء عندما "محصول" العقدة "مفقودة ... نظرت إلى جميع الخصائص على حد سواء من أجل domainclass وبالنسبة للمتاجر المنطلي بين طراز الجذر وفئة المجال من المستصلات ويبدو أنه لا يبدو أي منهم يتعاملون مع هذا. لقد بحثت أيضا في كل شيء في عقدة سلوك Explorer في نافذة DSL Explorer. أنا لاذع تماما. لا أحد يعرف كيفية القيام بذلك؟

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

المحلول

حسنا، بعد القليل من الأبحاث الشاملة، اكتشفت كيفية القيام بذلك. إليك ما فعلته، في حالة أي شخص آخر يحتاج إلى إجابة سؤالي في المستقبل. يجب عليك إنشاء فئة جزئية ل DSL Model's Designerexplorer (في مشروع DSLPackage، الذي تم إنشاؤه بواسطة ملف ModelExPlorer.tt) ووضع التعليمات البرمجية التالية في ذلك:

internal partial class MyDesignerExplorer
{
    /// <summary>
    /// Override to stop the "Delete" command appearing for
    /// Validators.
    /// </summary>
    protected override void ProcessOnStatusDeleteCommand( MenuCommand command )
    {
        // Check the selected items to see if they contain
        // Validators.
        if( this.SelectedElement.GetType()== typeof( Validators ) ) 
        {
            // Disable the menu command
            command.Enabled = false;
            command.Visible = false;
        }
        else
        {
            // Otherwise, delegate to the base method.
            base.ProcessOnStatusDeleteCommand( command );
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top