WPF PropertyGrid - 添加对集合的支持 [英] WPF PropertyGrid - adding support for collections

查看:24
本文介绍了WPF PropertyGrid - 添加对集合的支持的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在研究 wpf PropertyGrid(PG) 控件,我希望 PG 支持集合类型(IListObservableCollection 等)特性.我对如何跟踪所选项目(该集合的)并将其传递给客户端感到有些困惑.

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.com/wpg) 我会将更改/添加重新实施到控件中.

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 的属性 -

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

此属性将采用相关项目源属性的属性名称(其值将用于填充下拉列表).它将像这样使用 -

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆