Используя редактора набора.NET, не используя управление сеткой свойства

Угловые шаблоны будут искать переменные только в компоненте, который мы объявили в них. Так что внесите изменения, как показано ниже в вашем шаблоне

<p> {{service.message}} </p>

Здесь service - это то, что вы вводите в свой компонент.

Если вы объявите message:string в своем сервисе, это нормально, по умолчанию переменные являются общедоступными, и мы можем получить к ним доступ в шаблонах. Но с помощью служебной переменной мы вводим их через конструктор.

Я надеюсь, что это решит вашу проблему :)

5
задан Jon B 23 January 2009 в 16:23
поделиться

1 ответ

Можно получить эту функциональность от UITypeEditor (через TypeDescriptor), но это не тривиально - необходимо настроить IServiceProvider, IWindowsFormsEditorService, и идеально ITypeDescriptorContext - довольно мало faff. Могло бы быть более просто сделать это вручную, если Вы не знакомы с теми инструментами.

Кроме того - смотрят на SmartPropertyGrid.NET, альтернативу PropertyGrid.


Обновление: вот рабочий пример... определенно нетривиальный, но не стесняйтесь красть код. Это только работает на модальных редакторов, не выпадающих. Это также не яркий пример "разделения проблем". MyHelper класс является интересным.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing.Design;
using System.Windows.Forms;
using System.Windows.Forms.Design;
class Foo
{
    public Foo() { Bars = new List<Bar>(); }
    public List<Bar> Bars { get; private set; }
}
class Bar
{
    public string Name { get; set; }
    public DateTime DateOfBirth { get; set; }
}
static class Program
{
    [STAThread]
    static void Main()
    {
        Foo foo = new Foo();
        Bar bar = new Bar();
        bar.Name = "Fred";
        bar.DateOfBirth = DateTime.Today;
        foo.Bars.Add(bar);
        Application.EnableVisualStyles();
        using(Form form = new Form())
        using (Button btn = new Button())
        {
            form.Controls.Add(btn);
            btn.Text = "Edit";
            btn.Click += delegate
            {
                MyHelper.EditValue(form, foo, "Bars");
            };
            Application.Run(form);
        }
    }
}

class MyHelper : IWindowsFormsEditorService, IServiceProvider, ITypeDescriptorContext
{
    public static void EditValue(IWin32Window owner, object component, string propertyName) {
        PropertyDescriptor prop = TypeDescriptor.GetProperties(component)[propertyName];
        if(prop == null) throw new ArgumentException("propertyName");
        UITypeEditor editor = (UITypeEditor) prop.GetEditor(typeof(UITypeEditor));
        MyHelper ctx = new MyHelper(owner, component, prop);
        if(editor != null && editor.GetEditStyle(ctx) == UITypeEditorEditStyle.Modal)
        {
            object value = prop.GetValue(component);
            value = editor.EditValue(ctx, ctx, value);
            if (!prop.IsReadOnly)
            {
                prop.SetValue(component, value);
            }
        }
    }
    private readonly IWin32Window owner;
    private readonly object component;
    private readonly PropertyDescriptor property;
    private MyHelper(IWin32Window owner, object component, PropertyDescriptor property)
    {
        this.owner = owner;
        this.component = component;
        this.property = property;
    }
    #region IWindowsFormsEditorService Members

    public void CloseDropDown()
    {
        throw new NotImplementedException();
    }

    public void DropDownControl(System.Windows.Forms.Control control)
    {
        throw new NotImplementedException();
    }

    public System.Windows.Forms.DialogResult ShowDialog(System.Windows.Forms.Form dialog)
    {
        return dialog.ShowDialog(owner);
    }

    #endregion

    #region IServiceProvider Members

    public object GetService(Type serviceType)
    {
        return serviceType == typeof(IWindowsFormsEditorService) ? this : null;
    }

    #endregion

    #region ITypeDescriptorContext Members

    IContainer ITypeDescriptorContext.Container
    {
        get { return null; }
    }

    object ITypeDescriptorContext.Instance
    {
        get { return component; }
    }

    void ITypeDescriptorContext.OnComponentChanged()
    {}

    bool ITypeDescriptorContext.OnComponentChanging()
    {
        return true;
    }

    PropertyDescriptor ITypeDescriptorContext.PropertyDescriptor
    {
        get { return property; }
    }

    #endregion
}
10
ответ дан 13 December 2019 в 22:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: