Мне нужно свойство зависимости, которое может содержать список чего-либо. Если элемента нет, список не должен быть пустым, но свойство зависимости должно быть нулевым.
Вот определение:
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.
Если я заменю «новые метаданные свойств (нуль)» на «новые метаданные свойств (новый список ())», это сработает. Но в этом случае свойство зависимости не равно нулю, если нет элемента.
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, т. е. они всегда возвращают фактический объект коллекции, который может быть пустым.
@be_mi: Да. Какова твоя точка зрения? Именно так реализовано большинство свойств зависимостей коллекций, т. е. они всегда возвращают объект, который может быть пустым.
Как элементы могут стать нулевыми в этом сценарии? Существует множество ParameterControls, но только один или два получают назначенные элементы. Таким образом, я не хочу создавать ненужные объекты.
В каком сценарии? Конечно, это null
, если вы его где-то не инициализируете. И если список элементов «ненужный», вы можете вообще удалить это свойство. Как я уже сказал, свойство зависимости коллекции всегда возвращает коллекцию. Они никогда не должны возвращать значение null, потому что тогда вы не сможете заполнить их в XAML.
Хорошо, свойства зависимости коллекции всегда возвращают коллекцию и никогда не могут быть нулевыми. Это ответ, который я искал.
Обычно вы пишете SetCurrentValue(ElementsProperty, new List<Element>());
вместо Elements = new List<Element>();
, чтобы сеттер мог присвоить значение в стиле по умолчанию. Может быть менее релевантным для свойства типа коллекции, но может быть, например, Binding по умолчанию.
Преимущество этого варианта состоит в том, что каждое получение ParameterControl представляет собой один список. Но изначальная проблема в том, что есть пустой список, а не список, когда в списке нет элементов.