Ошибка привязки DataGrid для объекта, уже удаленного, когда BindingExpression использует массив Index - PullRequest
3 голосов
/ 16 декабря 2011

Я пытаюсь создать DataGrid , который заполняется установкой для свойства ItemsSource значения ObservableCollection из PropertyGroup , где каждый PropertyGroup объект содержит ObservableCollection объектов свойств. Все PropertyGroups имеют одинаковое количество объектов свойств, и поэтому я связываюсь с ними через использование пути и подстрочный индекс. Все работает нормально, за исключением того, что я получаю следующую ошибку привязки ПОСЛЕ того, как я удаляю объект PropertyGroup из DataGrid .

System.Windows.Data Error: 17 : Cannot get 'Item[]' value (type 'PropertyElement') 
from 'Children' (type 'ObservableCollection`1'). BindingExpression:Path=Children[3]
.Value; DataItem='PropertyGroupImpl' (HashCode=23661558); target element 
is 'TextBlock' (Name=''); target property is 'Text' (type 'String') 
ArgumentOutOfRangeException:'System.ArgumentOutOfRangeException: 
Specified argument was out of the range of valid values.
Parameter name: index'

Мой код:

public class DataGridView : UserControl
{
    public DataGridView()
    {
        Rows = new ObservableCollection<PropertyGroup>();

        m_DataGrid = new DataGrid();
        m_DataGrid.AutoGenerateColumns = false;
        m_DataGrid.ItemsSource = Rows;
        Content = m_DataGrid;
    }

    public ObservableCollection<PropertyGroup> Rows { get; set; }

    public void AddRowGroup(PropertyGroup propertyGroup)
    {
        if(Rows.Count == 0)
            InitDataGrid(propertyGroup);

        Rows.Add(propertyGroup);
    }

    public void RemoveRowGroup(PropertyGroup propertyGroup)
    {
        Rows.Remove(propertyGroup);
    }

    void InitDataGrid(PropertyGroup firstGroup)
    {
        for(int i = 0; i < firstGroup.Children.Count; ++i)
        {
            Property prop = firstGroup.Children[i] as Property;

            DataGridColumn dgCol = null;
            Binding bnd = new Binding();
            bnd.Path = new PropertyPath("Children[" + i + "].Value");

            if(prop.Type == Property.EnumType.eBool)
                dgCol = CreateBooleanColumn(bnd);
            else
                dgCol = CreateTextColumn(bnd, prop.Value.GetType());

            dgCol.Header = prop.Name;
            m_DataGrid.Columns.Add(dgCol);
        }
    }

    DataGridColumn CreateTextColumn(Binding bnd, Type propType)
    {
        var textCol = new DataGridTextColumn();

        // Styling code removed for brevity 

        textCol.Binding = bnd;
        return textCol;
    }

    DataGrid m_DataGrid;

    DataGridColumn CreateBooleanColumn(Binding bnd)
    {
        var chkBoxCol = new DataGridCheckBoxColumn();

        chkBoxCol.Binding = bnd;
        return chkBoxCol;
    }
}

public class PropertyGroup
{
    public PropertyGroup()
    {
        Children = new ObservableCollection<PropertyElement>();
    }

    public ObservableCollection<PropertyElement> Children { get; set; }
}

public class Property : PropertyElement
{
    public enum EnumType {eBool, eInt, eUInt, eFloat, eDouble, eString,
        eVector2, eVector3, eVector4, eEnum};

    public EnumType Type { get; set; }

    public object Value { get; set; }
}

public class PropertyElement
{
    public string Name { get; set; }
}

Ошибка привязки возникает после вызова RemoveRowGroup() для PropertyGroup , когда дочерние объекты Property удаляются из PropertyGroup Children ObservableCollection .

Кажется, что BindingExpressions , связывающий ячейки DataGrid с Property.Value, все еще пытается выполнить обновление после удаления объекта из DataGrid .

Есть идеи?

1 Ответ

3 голосов
/ 19 августа 2013

Как насчет присвоения свойства Source без индекса в PropertyPath?

Binding bnd = new Binding();
bnd.Path = new PropertyPath("Children[" + i + "].Value");

=>

Binding bnd = new Binding();
bnd.Source = firstGroup.Children[i];
bnd.Path = new PropertyPath("Value");

PS: я плохо разбираюсь в английском

...