.NET PropertyInfo.SetValue, казалось бы, игнорирует мои команды - PullRequest
0 голосов
/ 15 июля 2011

Как видно из темы, у меня есть некоторые проблемы с PropertyInfo.SetValue.Чтобы перейти к сути, вот мой пример - я создал свой собственный класс, и главное в нем - объект презентации:

using System;
using System.Reflection;

namespace TestingSetValue
{
public class Link
{
    private object presentationObject = null;
    private string captionInternal = string.Empty;

    public Link (string caption)
    {
        captionInternal = caption;
    }

    public string CaptionInternal
    {
        get { return captionInternal; }
        set { captionInternal = value; }
    }

    public bool Visible
    {
        get 
        {
            if (PresentationObject != null)
            {
                PropertyInfo pi = PresentationObject.GetType().GetProperty("Visible");

                if (pi != null)
                {
                    return Convert.ToBoolean(pi.GetValue(PresentationObject, null));
                }
            }

            return true;
        }

        set
        {
            if (PresentationObject != null)
            {
                PropertyInfo pi = PresentationObject.GetType().GetProperty("Visible");

                if (pi != null)
                {
                    pi.SetValue(PresentationObject, (bool)value, null);
                }
            }
        }
    }

    public object PresentationObject
    {
        get { return presentationObject; }
        set { presentationObject = value; }
    }

}

}

Затем я делаю это:

private void btnShowLink_Click(object sender, EventArgs e)
    {
        Link link = new Link("Here I am!");

        this.contextMenu.Items.Clear();
        this.contextMenu.Items.Add(link.CaptionInternal);

        link.PresentationObject = this.contextMenu.Items[0];
        link.Visible = true;

        lblCurrentVisibility.Text = link.Visible.ToString();
    }

Теперь я могу себе представить, что это не выглядит слишком логичным / экономичным, но оно показывает суть моей настоящей проблемы.А именно, почему видимость объекта презентации (и значение link.Visible) не меняется после того, как я позвоню:

link.Visible = true;

Я просто не знаю, что еще нужно сделать, чтобы заставить эту работу ..Любая помощь очень ценится.

Чтобы сделать вещи еще более интересными, свойство Enabled ведет себя так, как и ожидалось ...

PropertyInfo pi = PresentationObject.GetType().GetProperty("Enabled");

Может ли это быть связано с тем, что Visible являетсяна самом деле это свойство базового базового объекта ToolStripDropDownItem, тогда как Enabled является «прямым» свойством ToolStripDropDownItem?

Ответы [ 2 ]

1 голос
/ 15 июля 2011

Было бы проще выяснить это, если бы вы заранее сказали, что это за класс, но теперь мы знаем, что это ToolStripDropDownItem, который мы можем вывести как WinForms.

То, что вы видите, является странностью со свойством ToolStripItem Visible. Это сеттер и геттер не связаны напрямую. MSDN говорит

"Доступное свойство отличается от свойства Visible тем, что Доступно указывает, отображается ли ToolStripItem, а Visible указывает, отображается ли ToolStripItem и его родитель. настройка либо Доступно, либо Видимо для истины, либо ложно устанавливает другое свойство. на истину или ложь. "

Другими словами, вы хотите использовать свойство Available вместо свойства Visible

1 голос
/ 15 июля 2011

Проверка http://msdn.microsoft.com/en-us/library/system.web.ui.control.visible.aspx. Возможно, это вызывает вашу проблему.

Есть очень важная часть информации:

Если это свойство имеет значение false, серверный элемент управленияне отображаетсяВы должны принять это во внимание при организации макета вашей страницы.Если контейнерный элемент управления не отображается, любые содержащиеся в нем элементы управления не будут отображаться, даже если для свойства Visible отдельного элемента управления установлено значение true.В этом случае отдельный элемент управления возвращает false для свойства Visible, даже если вы явно установили для него значение true.(То есть , если для свойства Visible родительского элемента управления установлено значение false, дочерний элемент управления наследует этот параметр, и этот параметр имеет приоритет над любым локальным параметром .)

...