ObservableCollection <T>инициализация из xaml - Silverlight - PullRequest
1 голос
/ 11 июля 2011

У меня есть следующий DependencyProperty в пользовательском элементе управления Silverlight:

public static readonly DependencyProperty ColumnsProperty = DependencyProperty.Register( "Columns", typeof( ObservableCollection<FilterableDataGridColumn> ), typeof( FilterableDataGridControl ), new PropertyMetadata( new ObservableCollection<FilterableDataGridColumn>(), new PropertyChangedCallback( OnColumnsChanged ) ) );

public ObservableCollection<FilterableDataGridColumn> Columns {
    get {
        return ( ObservableCollection<FilterableDataGridColumn> )GetValue( ColumnsProperty );
    }
    set {
        SetValue( ColumnsProperty, value );
    }
}

static void OnColumnsChanged( object sender, DependencyPropertyChangedEventArgs args ) {
    ...
}

Я пытаюсь инициализировать его из xaml:

<my:FilterableDataGridControl ... >
    <my:FilterableDataGridControl.Columns>
        <my:FilterableDataGridColumn Header="Name" PropertyName="Name" ColumnType="Text" />
        <my:FilterableDataGridColumn Header="Type" PropertyName="Type" ColumnType="Text" />
    </my:FilterableDataGridControl.Columns>
</my:FilterableDataGridControl>

Но это не работает!Без исключений, без ошибок, но OnColumnsChanged не вызывается.

Есть идеи?

1 Ответ

1 голос
/ 11 июля 2011

Я полностью смоделировал ваш пример, и в основном вы ожидаете, что произойдет событие изменения свойства для изменений содержимого ObservableCollection. Ваш обработчик событий срабатывает только в случае замены самой коллекции, тогда как вы заменяете только дочерние элементы, а не коллекцию.

Единственный фрагмент вашего кода, который получит удар - это геттер:

get { return (ObservableCollection<FilterableDataGridColumn>)GetValue(ColumnsProperty); }

Может быть более изящный способ привязки событий к динамически создаваемым свойствам, но это будет работать:

    public ObservableCollection<FilterableDataGridColumn> Columns
    {
        get
        {
            var columns = (ObservableCollection<FilterableDataGridColumn>)GetValue(ColumnsProperty);
            columns.CollectionChanged -= columns_CollectionChanged; // Disconnect each time we reconnect
            columns.CollectionChanged += columns_CollectionChanged;
            return columns;
        }
        set
        {
            var columns = (ObservableCollection<FilterableDataGridColumn>)GetValue(ColumnsProperty);
            if (columns != null)
            {
                columns.CollectionChanged -= columns_CollectionChanged; // Disconnect each time we change collection
            }
            SetValue(ColumnsProperty, value);
        }
    }

    void columns_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        // This will get hit
    }

Это добавляет в коллекцию хандер CollectionChanged, а не прослушивает замену самой коллекции.

* Вы заметите, что сеттер пытается удалить хандера из любой предыдущей коллекции. Это мера «на всякий случай», так как в противном случае коллекция, отсоединенная от этого свойства, все равно будет сообщать об изменениях после удаления. Это не обязательно, чтобы заставить его работать для начальной коллекции, которую добавляет ваша собственность

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...