C # условное появление свойств в propertyGrid при редактировании нескольких объектов - PullRequest
1 голос
/ 28 марта 2012

Просто наткнулся на propertyGrid и его классно!Однако у меня есть одна задача, которую я не могу найти, как с ней справиться:

У меня есть класс, который имеет тип.В зависимости от типа, он имеет различные доступные свойства.Я держу его в одном классе (не в нескольких унаследованных классах) для простоты (существует десять типов, но они в основном имеют одинаковые свойства).

Например, у меня есть класс MapObject, который может иметь строковый тип, равный "игрок "или" враг ".Для «врага» используется свойство «имя», но для «игрока» оно пустое (не используется).

Когда я выбираю два объекта, один из которых относится к типу «игрок», а другой - к типу «враг», я хочу, чтобы свойство «имя» только «рассчитывало» для «врага».Итак, я хочу, чтобы propertyGrid показывал имя объекта, который имеет тип = "враг", и когда оно (свойство имени) изменяется в сетке, присваивайте его только объекту типа "враг".

Возможно ли это сделать?

Ответы [ 2 ]

1 голос
/ 15 декабря 2017

В зависимости от того, чей PropertyGrid вы используете, переключение атрибута Browsable может делать то, что вы хотите. Смотрите мой ответ здесь о том, как это сделать во время выполнения.

Если, как и я, вы используете Xceed PropertyGrid , то изменение атрибута Browsable только во время выполнения после загрузки элемента управления ничего не делает. Вместо этого мне также пришлось изменить коллекцию PropertyDefinitions. Вот метод расширения для этого:

    /// <summary>
    /// Show (or hide) a property within the property grid.
    /// Note: if you want to initially hide the property, it may be
    /// easiest to set the Browable attribute of the property to false.
    /// </summary>
    /// <param name="pg">The PropertyGrid on which to operate</param>
    /// <param name="property">The name of the property to show or hide</param>
    /// <param name="show">Set to true to show and false to hide</param>
    public static void ShowProperty(this PropertyGrid pg, string property, bool show)
    {
        int foundAt = -1;
        for (int i=0; i < pg.PropertyDefinitions.Count; ++i)
        {
            var prop = pg.PropertyDefinitions[i];
            if (prop.Name == property)
            {
                foundAt = i;
                break;
            }
        }
        if (foundAt == -1)
        {
            if (show)
            {
                pg.PropertyDefinitions.Add(
                    new Xceed.Wpf.Toolkit.PropertyGrid.PropertyDefinition()
                    {
                        Name = property,
                    }
                );
            }
        }
        else
        {
            if (!show)
            {
                pg.PropertyDefinitions.RemoveAt(foundAt);
            }
        }
    }

В случае, если вышеперечисленное не работает для вас, следующее может работать лучше и в любом случае проще. Он также не использует устаревшие свойства, как в коде выше ...

    public static void ShowProperty(this PropertyGrid pg, string property, bool show)
    {
        for (int i = 0; i < pg.Properties.Count; ++i)
        {
            PropertyItem prop = pg.Properties[i] as PropertyItem;

            if (prop.PropertyName == property)
            {
                prop.Visibility = show ? System.Windows.Visibility.Visible : System.Windows.Visibility.Collapsed;
                break;
            }
        }
    }
0 голосов
/ 28 марта 2012

Это шаблон проектирования, известный как шаблон состояния. Это довольно легко реализовать, и вам не нужны сетки свойств. http://www.dofactory.com/Patterns/PatternState.aspx

...