UserControl中的wpf绑定集合属性

我有一个自定义UserControl,其中包含自定义对象的集合。

public class Question : FrameworkElement { public readonly static DependencyProperty FullNameProperty = DependencyProperty.Register("FullName", typeof(string), typeof(Question)); public readonly static DependencyProperty ShortNameProperty = DependencyProperty.Register("ShortName", typeof(string), typeof(Question)); public readonly static DependencyProperty RecOrderProperty = DependencyProperty.Register("RecOrder", typeof(int), typeof(Question)); public readonly static DependencyProperty AnswerProperty = DependencyProperty.Register("Answer", typeof(string), typeof(Question)); public string FullName { get { return (string)GetValue(FullNameProperty); } set { SetValue(NameProperty, value); } } public string ShortName { get { return (string)GetValue(ShortNameProperty); } set { SetValue(ShortNameProperty, value); } } public string Answer { get { return (string)GetValue(AnswerProperty); } set { SetValue(AnswerProperty, value); } } public int RecOrder { get { return (int)GetValue(RecOrderProperty); } set { SetValue(RecOrderProperty, value); } } } 

在我的控制代码后面,我有

 public readonly static DependencyProperty QuestionsProperty = DependencyProperty.Register("Questions", typeof(ObservableCollection), typeof(FormQuestionReportViewer), new PropertyMetadata(new ObservableCollection())); public ObservableCollection Questions { get { return GetValue(QuestionsProperty) as ObservableCollection; } set { SetValue(QuestionsProperty, value); } } 

在xaml标记中,我可以像这样定义我的控件

        

它运行良好,但我想在xaml中绑定我的集合属性,就像这样

       

我怎么能做那个绑定?

您必须公开两个单独的属性,就像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 Questions ,你可以明确地添加项目:

 private ObservableCollection questions = new ObservableCollection(); public ObservableCollection Questions { get { return questions; } } 

然后您可以像这样使用这些属性:

      

当您想要获得完整的项目列表时,需要额外的工作。 您需要将两个集合合并为一个集合。 此统一集合将作为第三个属性公开,它返回只读集合。