- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
-6ren">
到目前为止,我将 Xceed propertygrid 与 AutoGenerateProperties="True"
一起使用,并使用 [Browsable(false)]
指定我不想显示的属性> 属性。
现在我有一个案例,我只需要显示一部分属性,具体取决于其他属性的值。
我认为答案是使用PropertyDefinitions
,如图here .
但该示例仅展示了如何实现将用于每个检查对象的一组 PropertyDefinitions
。
关于如何定义多组 PropertyDefinitions
并选择何时使用它们,您是否有提示或示例?
最佳答案
抱歉,这是一个冗长的回答。我也曾经使用过 AutoGenerateProperties="True"
但是我遇到了类似的问题。
我最终的解决方案是按照您的建议填充 PropertyDefinition
。我以编程方式执行此操作,因为我最终遇到了一些相当特殊的情况,这些情况需要根据某处集合的内容动态创建属性。我注意到的一件事是,即使通过编程检查我的类来模拟 AutoGenerateProperties="True"
功能,我的速度也比他们的解决方案快得多。
为了按照您的要求处理可见性,尽管我必须创建自己的 Attribute
以使项目从 PropertyGrid
中不可见。
public class VisibilityAttribute : Attribute
{
public Visibility Visibility { get; private set; }
public VisibilityAttribute(Visibility visibility)
{
this.Visibility = visibility;
}
}
在我的项目中可以选择的每个项目都有自己的 PropertySetBase 类实现,该类具有如下属性定义:
[Category("Appearance"), LocalisedProperty(typeof(PropertySetBase), "LocalBackground", "LocalBackgroundDescription"), Editor(typeof(OptionalBrushEditor), typeof(OptionalBrushEditor)),
PropertyOrder(0)]
public virtual OptionalProperty<Brush> LocalBackground { get; set; }
然后处理 currentPropertySelection
集合中的 PropertySetBase
的逻辑。
private void PreparePropertyGrid()
{
PropertyDefinitionCollection propertyDefinitions = new PropertyDefinitionCollection();
// This is how I determine
var mainPropertySet = this.currentPropertySelection.FirstOrDefault();
if (mainPropertySet != null)
{
var properties = TypeDescriptor.GetProperties(mainPropertySet.GetType());
// Allowing for multiple selection, if on further iterations through the selected items we will remove properties that do not exist in both PropertySets
bool firstIteration = true;
foreach (var x in this.currentPropertySelection)
{
foreach (var p in properties.Cast<PropertyDescriptor>())
{
if (!firstIteration)
{
// Perhaps we should be checking a little more safely for TargetProperties but if the collection is empty we have bigger problems.
var definition = propertyDefinitions.FirstOrDefault(d => string.Equals(d.TargetProperties[0] as string, p.Name, StringComparison.Ordinal));
// Someone in the selection does not have this property so we can ignore it.
if (definition == null)
{
continue;
}
// If this item doesn't have the property remove it from the display collection and proceed.
var localProperty = x.GetType().GetProperty(p.Name);
if (localProperty == null)
{
propertyDefinitions.Remove(definition);
continue;
}
// There is actually no point in proceeding if this is not the first iteration and we have checked whether the property exists.
continue;
}
string category = p.Category;
string description = p.Description;
string displayName = p.DisplayName ?? p.Name;
int? displayOrder = null;
bool? isBrowsable = p.IsBrowsable;
bool? isExpandable = null;
var orderAttribute = p.Attributes[typeof(PropertyOrderAttribute)] as PropertyOrderAttribute;
if (orderAttribute != null)
{
displayOrder = orderAttribute.Order;
}
var expandableAttribute = p.Attributes[typeof(ExpandableObjectAttribute)] as ExpandableObjectAttribute;
if (expandableAttribute != null)
{
isExpandable = true;
}
propertyDefinitions.Add(new PropertyDefinition
{
Category = category,
Description = description,
DisplayName = displayName,
DisplayOrder = displayOrder,
IsBrowsable = isBrowsable,
IsExpandable = isExpandable,
TargetProperties = new[] { p.Name },
});
}
}
firstIteration = false;
this.propertyGrid.PropertyDefinitions = propertyDefinitions;
}
}
在实际显示/隐藏属性时,我执行了以下操作:
public void UpdateProperties(Tuple<string, bool?, Visibility?>[] newPropertyStates)
{
// Note this currently works under the assumption that an Item has to be selected in order to have a value changed.
this.suppressPropertyUpdates = true;
foreach (var property in newPropertyStates)
{
string propertyName = property.Item1;
string[] splits = propertyName.Split('.');
if (splits.Length == 1)
{
this.propertyGrid.Properties.OfType<PropertyItem>()
.Where(p => string.Equals(p.PropertyDescriptor.Name, propertyName, StringComparison.Ordinal))
.Map(p =>
{
if (property.Item2.HasValue)
{
p.IsEnabled = property.Item2.Value;
}
if (property.Item3.HasValue)
{
p.Visibility = property.Item3.Value;
}
});
}
else // We currently don't expect to go any lower than 1 level.
{
var parent = this.propertyGrid.Properties.OfType<PropertyItem>()
.Where(p => string.Equals(p.PropertyDescriptor.Name, splits[0], StringComparison.Ordinal))
.FirstOrDefault();
if (parent != null)
{
parent.Properties.OfType<PropertyItem>()
.Where(p => string.Equals(p.PropertyDescriptor.Name, splits[1], StringComparison.Ordinal))
.Map(p =>
{
if (property.Item2.HasValue)
{
p.IsEnabled = property.Item2.Value;
}
if (property.Item3.HasValue)
{
p.Visibility = property.Item3.Value;
}
});
}
}
}
this.suppressPropertyUpdates = false;
}
然后在 PreparePropertyItem 事件处理程序中,我检查我的 VisibilityAttribute 并相应地更新属性项。
void PropertyGrid_PreparePropertyItem(object sender, PropertyItemEventArgs e)
{
foreach (var x in this.currentPropertySelection)
{
// If we are in read-only mode do not allow the editing of any property.
if (this.IsReadOnly)
{
e.PropertyItem.IsEnabled = false;
}
string propertyName = ((PropertyItem)e.PropertyItem).PropertyDescriptor.Name;
PropertyInfo property = x.GetType().GetProperty(propertyName);
var propertyItem = e.Item as PropertyItem;
// If the property doesn't exist then check to see if it is on an expandable item.
if (property == null)
{
property = propertyItem.Instance.GetType().GetProperty(propertyName);
}
bool hasProperty = property != null;
if (hasProperty)
{
var browsableAttribute = property.GetCustomAttribute<BrowsableAttribute>(true);
if (browsableAttribute != null &&
!browsableAttribute.Browsable)
{
e.PropertyItem.Visibility = Visibility.Collapsed;
e.Handled = true;
break;
}
var visibilityAttribute = property.GetCustomAttribute<VisibilityAttribute>(true);
if (visibilityAttribute != null)
{
e.PropertyItem.Visibility = visibilityAttribute.Visibility;
e.Handled = true;
}
var independentAttribute = property.GetCustomAttribute<IndependentAttribute>(true);
// If a property is marked as being independent then we do not allow editing if multiple items are selected
if (independentAttribute != null &&
this.currentPropertySelection.Length > 1)
{
e.PropertyItem.IsEnabled = false;
e.Handled = true;
break;
}
}
}
}
关于c# - xceed 属性网格 : choose between sets of custom propertydefinitions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38783975/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!