WPF PropertyGrid - 添加对集合的支持 [英] WPF PropertyGrid - adding support for collections
问题描述
我正在处理wpf PropertyGrid
(PG)控件,我想要PG支持集合类型( IList
, ObservableCollection
等)属性。
I am working on wpf PropertyGrid
(PG) control and I want the PG to support collection type(IList
, ObservableCollection
etc.) properties. I am bit confused on how to keep track of selected item(of that collection) and pass that to client.
任何想法?
如果解决方案使用开源WPF PropertyGrid( http://www.codeplex。
If the solution makes use of the Open Source WPF PropertyGrid (http://www.codeplex.com/wpg) I will implement the changes /additions back into the control.
推荐答案
没有答案证明有是没有直接的方式这样做。所以我用这种方式实现了这个特性 -
No answers proves that there is no straight forward way of doing this. So I implemented this feature this way -
我创建了一个属性名为 RelatedItemSourcePropertyAttribute
b
$ b
I created an attribute named RelatedItemSourcePropertyAttribute
like this -
/// <summary>
/// Attribute to identify the related item source property.
/// Note: Property should be of IEnumerable type
/// </summary>
[global::System.AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = false)]
public sealed class RelatedItemSourcePropertyAttribute : Attribute
{
// See the attribute guidelines at
// http://go.microsoft.com/fwlink/?LinkId=85236
private string relatedPropertyName;
public static readonly RelatedItemSourcePropertyAttribute Default = new RelatedItemSourcePropertyAttribute(string.Empty);
/// <summary>
/// Initializes a new instance of the <see cref="RelatedPropertyAttribute"/> class.
/// </summary>
/// <param name="relatedPropertyName">Name of the related property.</param>
public RelatedItemSourcePropertyAttribute(string relatedPropertyName)
{
this.relatedPropertyName = relatedPropertyName;
}
/// <summary>
/// Gets a value indicating whether [related property name].
/// </summary>
/// <value><c>true</c> if [related property name]; otherwise, <c>false</c>.</value>
public string RelatedPropertyName
{
get { return relatedPropertyName; }
}
/// <summary>
/// Determines whether the specified <see cref="System.Object"/> is equal to this instance.
/// </summary>
/// <param name="obj">The <see cref="System.Object"/> to compare with this instance.</param>
/// <returns>
/// <c>true</c> if the specified <see cref="System.Object"/> is equal to this instance; otherwise, <c>false</c>.
/// </returns>
public override bool Equals(object obj)
{
if (!(obj is RelatedItemSourcePropertyAttribute))
return false;
if (obj == this)
return true;
return ((RelatedItemSourcePropertyAttribute)obj).relatedPropertyName == relatedPropertyName;
}
/// <summary>
/// Returns a hash code for this instance.
/// </summary>
/// <returns>
/// A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table.
/// </returns>
public override int GetHashCode()
{
return relatedPropertyName.GetHashCode();
}
/// <summary>
/// When overridden in a derived class, indicates whether the value of this instance is the default value for the derived class.
/// </summary>
/// <returns>
/// true if this instance is the default attribute for the class; otherwise, false.
/// </returns>
public override bool IsDefaultAttribute()
{
return relatedPropertyName == RelatedItemSourcePropertyAttribute.Default.relatedPropertyName;
}
}
此属性将使用相关项目的属性名称source属性(其值将用于填充下拉列表)。它会像这样使用 -
this attribute will take the property name of the related item source property(whose value will be used to fill the dropdown). It will be used like this -
[RelatedItemSourceProperty("UnitNames")]
public virtual string SelectedUnit
{
get { return (string)GetValue(SelectedUnitProperty); }
set { SetValue(SelectedUnitProperty, value); }
}
public static readonly DependencyProperty SelectedUnitProperty =
DependencyProperty.Register("SelectedUnit", typeof(string), typeof(BaseControl),
new UIPropertyMetadata(string.Empty, new PropertyChangedCallback(SelectedUnitChangedCallBack)));
public virtual ObservableCollection<string> UnitNames
{
get { return (ObservableCollection<string>)GetValue(UnitNamesProperty); }
set { SetValue(UnitNamesProperty, value); }
}
public static readonly DependencyProperty UnitNamesProperty =
DependencyProperty.Register("UnitNames", typeof(ObservableCollection<string>),
typeof(BaseProperties), new PropertyMetadata(null)); //Validation
,然后在属性中将相关项目源属性绑定到组合框。
and then in property I binded the related item source property with the combobox.
希望看到更好的解决方案,然后这是:)
Hope to see a better solution then this :)
这篇关于WPF PropertyGrid - 添加对集合的支持的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!