.net wpf silverlight collections propertygrid

.net - WPF PropertyGrid: agregar soporte para colecciones



silverlight collections (1)

Ninguna respuesta demuestra que no hay una manera directa de hacer esto. Así que implementé esta función de esta manera:

RelatedItemSourcePropertyAttribute un atributo llamado RelatedItemSourcePropertyAttribute como este -

/// <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; } }

este atributo tomará el nombre de propiedad de la propiedad de origen del elemento relacionado (cuyo valor se utilizará para completar el menú desplegable). Se usará así -

[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

y luego en la propiedad ligé la propiedad de la fuente del elemento relacionado con el cuadro combinado.

Espero ver una mejor solución que esto :)

Estoy trabajando en el control wpf PropertyGrid (PG) y deseo que PG admita propiedades de tipo colección ( IList , ObservableCollection , etc.). Estoy un poco confundido sobre cómo hacer un seguimiento del elemento seleccionado (de esa colección) y pasarlo al cliente.

¿Algunas ideas?

Si la solución hace uso de Open Source WPF PropertyGrid ( http://www.codeplex.com/wpg ), implementaré los cambios / adiciones nuevamente en el control.