通常限制对值类型集合的编辑(以及在PropertyGrid中)

时间:2015-10-26 16:53:50

标签: c# winforms collections properties propertygrid

我的类有一组布尔值。我想允许更改值,但限制添加或删除它们。 (特别是在PropertyGrid控件中)。

到目前为止,我已经用Google搜索了

.AsReadOnly()

方法作为推荐的解决方案,但与引用类型集合(添加/删除受限制的,已成功保存的更改值)相比,它与值类型的值(添加/删除受限制但未保存更改的值)的工作方式不同

我为这种行为做了一个简短的例子: 考虑一个包装布尔值的类:

class boolWrapper
{
    public bool boolValue { get; set; }

    public boolWrapper (bool boolValue)
    {
        this.boolValue = boolValue;
    }
}

还有一些其他类使用这两种集合:

class testClassWithArray
{
    // Collection of booleans
    private List<bool> _boolArray;
    public ReadOnlyCollection<bool> boolArray
    {
        get { return _boolArray.AsReadOnly(); }
    }

    // Collection of wrapped booleans
    private List<boolWrapper> _boolWrappedArray;
    public ReadOnlyCollection<boolWrapper> boolWrappedArray
    {
        get { return _boolWrappedArray.AsReadOnly(); }
    }

    // Filling collections with some values
    public testClassWithArray()
    {
        _boolArray = new List<bool>();
        _boolWrappedArray = new List<boolWrapper>();

        for (int i = 0; i < 3; i++)
        {
            _boolArray.Add(false);
            _boolWrappedArray.Add(new boolWrapper(false));
        }
    }
}

让我们分配一个PropertyGrid:

        testClassWithArray testArr = new testClassWithArray();
        testPropertyGrid.SelectedObject = testArr;

当更改两个集合的值(boolWrappedArray,boolArray)时,包装值的集合会成功应用新值,但不能替换另一个值。

虽然这种行为可以理解,但有没有办法在没有包装类的情况下,限制添加/删除操作并为值类型集合应用新值?

1 个答案:

答案 0 :(得分:0)

  

虽然这种行为可以理解,但有没有办法在没有包装类的情况下,限制添加/删除操作并为值类型集合应用新值?

虽然一般不推荐,但最简单的方法就是将这些集合公开为Array(不添加/删除,只编辑,不幸的是没有任何控制(验证)),像这样

class testClassWithArray
{
    // Collection of booleans
    public bool[] boolArray { get; private set; }

    // Collection of wrapped booleans
    private List<boolWrapper> _boolWrappedArray;
    public ReadOnlyCollection<boolWrapper> boolWrappedArray
    {
        get { return _boolWrappedArray.AsReadOnly(); }
    }

    // Filling collections with some values
    public testClassWithArray()
    {
        boolArray = new bool[3];
        _boolWrappedArray = new List<boolWrapper>();
        for (int i = 0; i < 3; i++)
        {
            _boolWrappedArray.Add(new boolWrapper(false));
        }
    }
}