WPF PropertyGrid - Adding Collection Support
I am working on wpf control PropertyGrid
(PG) and I want PG to support collection types ( IList
, ObservableCollection
etc.). I am a bit confused about how to track the selected item (from this collection) and pass it to the client.
Any ideas?
If the solution is using the open source Open Source WPF PropertyGrid ( http://www.codeplex.com/wpg ) I will make the changes / additions back to the control.
a source to share
None of the answers prove that there is no direct way to do this. Therefore, I have implemented this function in this way -
I created an attribute with a name 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;
}
}
this attribute will take the property name of the associated element source property (whose value will be used to populate 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 the property, I bound the source property of the linked item to the combo box.
Hope to see a better solution and then this :)
a source to share