Поведение пользовательского элемента управления с помощью DependencyProperty - PullRequest
0 голосов
/ 25 ноября 2018

Я нахожу странное поведение дизайнера xaml с DataGrid-CustomControl.Там у меня есть DependencyProperty:

public static readonly DependencyProperty CustomizableColumnsProperty =
    DependencyProperty.Register(
        "CustomizableColumns",
        typeof(ObservableCollection<DataGridColumn>),
        typeof(DataGridCustomizable),
        new PropertyMetadata(new ObservableCollection<DataGridColumn>()));

В XAML-Designer у меня есть следующий код:

<ctrl:DataGridCustomizable
    <ctrl:DataGridCustomizable.CustomizableColumns>
         ... the columns

В переопределенном методе

protected override void OnInitialized(EventArgs e)

Я положилCustomizableColumns для столбцов DataGrid (только в DesignMode)

Теперь вот мое уведомление.Первое открытие дизайнера XAML после новой сборки ничего не воспринимает из CustomizableColumns.Поэтому в методе OnInitialized никакие столбцы не добавляются!

Затем я закрываю и снова открываю конструктор XAML, и только сейчас известны CustomizableColumns, а метод OnInitialized помещает CustomizableColumns в столбцы DataGrid.

Вы знаете причину этого?Спасибо за ваш вклад!

1 Ответ

0 голосов
/ 26 ноября 2018

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

Вместо этого вам следует установить значение по умолчанию с помощью вызова SetCurrentValue в конструкторе элемента управления.

public static readonly DependencyProperty CustomizableColumnsProperty =
    DependencyProperty.Register(
        nameof(CustomizableColumns),
        typeof(ObservableCollection<DataGridColumn>),
        typeof(DataGridCustomizable));

...

public DataGridCustomizable()
{
    SetCurrentValue(CustomizableColumnsProperty,
        new ObservableCollection<DataGridColumn>());
} 

Использование SetCurrentValue вместо SetValue гарантирует, что любой Binding, Style Setter или другой источник значений свойства зависимостей по-прежнему работает правильно.

...