偶然发现了propertyGrid及其真棒!但是,我有一个任务,我无法找到如何处理它:
我有一个类型的类。根据类型,它具有不同的属性。为简单起见,我将它保存在一个类(不是多个继承的类)中(有十种类型但它们大多具有相同的属性)。
例如,我有一个类MapObject,其字符串类型可以等于“player”或“enemy”。对于“敌人”,使用属性“名称”,但对于“玩家”,它是空白的(未使用)。
当我选择两个对象,其中一个是“玩家”类型而另一个类型为“敌人”时,我希望属性“名称”仅为“敌人”“计数”。因此,我希望propertyGrid显示具有type =“enemy”的对象的名称,并且在Grid中更改它(name属性)时,只将其分配给“enemy”类型的对象。
这可能吗?
答案 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