WPF/XAML: добавление элемента в свойство зависимостей списка типов

Мне нужно свойство зависимости, которое может содержать список чего-либо. Если элемента нет, список не должен быть пустым, но свойство зависимости должно быть нулевым.

Вот определение:

public List<Element> Elements {
  get { return (List<Element>)GetValue(ElementsProperty); }
  set { SetValue(ElementsProperty, value); }
}

public static readonly DependencyProperty ElementsProperty =
    DependencyProperty.Register("Elements", typeof(List<Element>), typeof(ParameterControl), new PropertyMetadata(null));

При добавлении элемента...

<controls:Knob.Elements>
    <controls:Element Position = "50,0" Text = "j"/>
</controls:Knob.Elements>

... Я получаю это исключение.

System.Windows.Markup.XamlParseException: ... "Elements" ist NULL.

Если я заменю «новые метаданные свойств (нуль)» на «новые метаданные свойств (новый список ())», это сработает. Но в этом случае свойство зависимости не равно нулю, если нет элемента.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
275
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

If I replace "new PropertyMetadata(null)" by "new PropertyMetadata(new List())", it's working.

Затем список по умолчанию будет общим для всех экземпляров элемента управления. Если вам нужен список по умолчанию, вы должны инициализировать List<Element> в конструкторе:

public class ParameterControl : Control
{
    public ParameterControl()
    {
        Elements = new List<Element>();
    }

    public List<Element> Elements
    {
        get { return (List<Element>)GetValue(ElementsProperty); }
        set { SetValue(ElementsProperty, value); }
    }

    public static readonly DependencyProperty ElementsProperty =
        DependencyProperty.Register("Elements", typeof(List<Element>), typeof(ParameterControl), new PropertyMetadata(null));

}

Именно так реализовано большинство свойств зависимости коллекции в WPF, т. е. они всегда возвращают фактический объект коллекции, который может быть пустым.

Преимущество этого варианта состоит в том, что каждое получение ParameterControl представляет собой один список. Но изначальная проблема в том, что есть пустой список, а не список, когда в списке нет элементов.

be_mi 24.05.2019 15:31

@be_mi: Да. Какова твоя точка зрения? Именно так реализовано большинство свойств зависимостей коллекций, т. е. они всегда возвращают объект, который может быть пустым.

mm8 24.05.2019 15:33

Как элементы могут стать нулевыми в этом сценарии? Существует множество ParameterControls, но только один или два получают назначенные элементы. Таким образом, я не хочу создавать ненужные объекты.

be_mi 24.05.2019 15:40

В каком сценарии? Конечно, это null, если вы его где-то не инициализируете. И если список элементов «ненужный», вы можете вообще удалить это свойство. Как я уже сказал, свойство зависимости коллекции всегда возвращает коллекцию. Они никогда не должны возвращать значение null, потому что тогда вы не сможете заполнить их в XAML.

mm8 24.05.2019 15:42

Хорошо, свойства зависимости коллекции всегда возвращают коллекцию и никогда не могут быть нулевыми. Это ответ, который я искал.

be_mi 24.05.2019 15:45

Обычно вы пишете SetCurrentValue(ElementsProperty, new List<Element>()); вместо Elements = new List<Element>();, чтобы сеттер мог присвоить значение в стиле по умолчанию. Может быть менее релевантным для свойства типа коллекции, но может быть, например, Binding по умолчанию.

Clemens 24.05.2019 19:40

Другие вопросы по теме