كيف يمكنني حقن UITypeEditor مخصصة لكافة الخصائص من نوع مغلقة المصدر؟

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

سؤال

وأريد أن تجنب وضع EditorAttribute في كل حالة من الحالات من نوع معين أن قمت بكتابة UITypeEditor مخصصة ل.

وأنا لا يمكن وضع EditorAttribute على نوع لأنني لا يمكن تعديل المصدر.

ولدي إشارة إلى مثيل PropertyGrid الوحيد الذي سيتم استخدامه.

هل أقول مثيل PropertyGrid (أو كل الحالات) لاستخدام UITypeEditor مخصصة كلما كان يصادف نوع معين؟

هنا هو مقال MSDN التي توفر ونقطة انطلاق على كيفية القيام بذلك في 2.0 .NET أو أكبر.

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

المحلول

ويمكنك عادة ربط المحررين وغيرها في وقت التشغيل عبر TypeDescriptor.AddAttributes. على سبيل المثال (الخاصية Bar ينبغي أن تظهر مع "..." يعرض "التحرير"):

using System;
using System.ComponentModel;
using System.Drawing.Design;
using System.Windows.Forms;

class Foo
{
    public Foo() { Bar = new Bar(); }
    public Bar Bar { get; set; }
}
class Bar
{
    public string Value { get; set; }
}

class BarEditor : UITypeEditor
{
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
    {
        return UITypeEditorEditStyle.Modal;
    }
    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
    {
        MessageBox.Show("Editing!");
        return base.EditValue(context, provider, value);
    }
}
static class Program
{
    [STAThread]
    static void Main()
    {
        TypeDescriptor.AddAttributes(typeof(Bar),
            new EditorAttribute(typeof(BarEditor), typeof(UITypeEditor)));
        Application.EnableVisualStyles();
        Application.Run(new Form { Controls = { new PropertyGrid { SelectedObject = new Foo() } } });
    }
}

نصائح أخرى

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

وكان لي حل لكتابة ViewModel<T> المجمع، الذي نسخ الخصائص من T، يحشي مع بعض سمات إضافية. لنفترض لدينا datum متغير نوع التقرير، كنا استخدامها مثل هذا

        var pretty = ViewModel<Report>.DressUp(datum);
        pretty.PropertyAttributeReplacements[typeof(Smiley)] = new List<Attribute>() { new EditorAttribute(typeof(SmileyEditor),typeof(UITypeEditor))};
        propertyGrid1.SelectedObject = pretty;

وأين يعرف ViewModel<T>:

public class ViewModel<T> : CustomTypeDescriptor
{
    private T _instance;
    private ICustomTypeDescriptor _originalDescriptor;
    public ViewModel(T instance, ICustomTypeDescriptor originalDescriptor) : base(originalDescriptor)
    {
        _instance = instance;
        _originalDescriptor = originalDescriptor;
        PropertyAttributeReplacements = new Dictionary<Type,IList<Attribute>>();
    }

    public static ViewModel<T> DressUp(T instance)
    {
        return new ViewModel<T>(instance, TypeDescriptor.GetProvider(instance).GetTypeDescriptor(instance));
    }

    /// <summary>
    /// Most useful for changing EditorAttribute and TypeConvertorAttribute
    /// </summary>
    public IDictionary<Type,IList<Attribute>> PropertyAttributeReplacements {get; set; } 

    public override PropertyDescriptorCollection GetProperties (Attribute[] attributes)
    {
        var properties = base.GetProperties(attributes).Cast<PropertyDescriptor>();

        var bettered = properties.Select(pd =>
            {
                if (PropertyAttributeReplacements.ContainsKey(pd.PropertyType))
                {
                    return TypeDescriptor.CreateProperty(typeof(T), pd, PropertyAttributeReplacements[pd.PropertyType].ToArray());
                }
                else
                {
                    return pd;
                }
            });
        return new PropertyDescriptorCollection(bettered.ToArray());
    }

    public override PropertyDescriptorCollection GetProperties()
    {
        return GetProperties(null);
    }
}

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

محرر السمة لديك الطبقة.

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