Вам нужно будет предоставить два отдельных свойства, очень похожих на ItemsControl
, у которого есть свойства Items и ItemsSource .Похоже, что вы хотите иметь возможность добавлять элементы, используя привязку и явно, добавляя в свою коллекцию.Это поведение будет отличаться от ItemsControl, который позволяет вам использовать только свойство Items или ItemsSource, но не оба одновременно.
Ничто не мешает вам добавить поддержку обоих способов указания элементов,но это будет больше работы с вашей стороны.
Во-первых, вам понадобится свойство DependencyProperty, такое как IEnumerable QuestionsSource
, к которому вы можете привязать:
public readonly static DependencyProperty QuestionsSourceProperty =
DependencyProperty.Register("QuestionsSource",
typeof(IEnumerable),
typeof(FormQuestionReportViewer),
new PropertyMetadata(null));
public IEnumerable QuestionsSource
{
get { return GetValue(QuestionsSourceProperty) as IEnumerable; }
set { SetValue(QuestionsSourceProperty, value); }
}
секунду, вы бынеобходимо обычное свойство CLR, такое как ObservableCollection<Question> Questions
, к которому можно явно добавить элементы:
private ObservableCollection<Question> questions = new ObservableCollection<Question>();
public ObservableCollection<Question> Questions
{
get { return questions; }
}
Затем вы можете использовать эти свойства следующим образом:
<custom:CustomControl QuestionsSource="{Binding Path=Questions}">
<custom:CustomControl.Questions>
<custom:Question FullName="{binding Name}" ShortName="{binding ShortName}" RecOrder="{binding RecOrder}" Answer={binding Answer}" />
</custom:CustomControl.Questions>
</custom:CustomControl>
Дополнительная работанаступает, когда вы хотите получить полный список предметов.Вам нужно объединить две коллекции в одну коллекцию.Эта объединенная коллекция будет представлена как третье свойство, которое возвращает коллекцию только для чтения.