C#在编辑多个对象时在propertyGrid中有条件地出现属性

时间:2012-03-28 16:16:50

标签: c# properties propertygrid

偶然发现了propertyGrid及其真棒!但是,我有一个任务,我无法找到如何处理它:

我有一个类型的类。根据类型,它具有不同的属性。为简单起见,我将它保存在一个类(不是多个继承的类)中(有十种类型但它们大多具有相同的属性)。

例如,我有一个类MapObject,其字符串类型可以等于“player”或“enemy”。对于“敌人”,使用属性“名称”,但对于“玩家”,它是空白的(未使用)。

当我选择两个对象,其中一个是“玩家”类型而另一个类型为“敌人”时,我希望属性“名称”仅为“敌人”“计数”。因此,我希望propertyGrid显示具有type =“enemy”的对象的名称,并且在Grid中更改它(name属性)时,只将其分配给“enemy”类型的对象。

这可能吗?

2 个答案:

答案 0 :(得分:1)

根据您使用的PropertyGrid,切换Browsable属性可能会执行您想要的操作。有关如何在运行时执行此操作,请参阅我的answer here

如果像我一样使用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;
            }
        }
    }

答案 1 :(得分:0)

这是一种称为状态模式的设计模式。它很容易实现,您不需要属性网格。 http://www.dofactory.com/Patterns/PatternState.aspx