从未设置依赖属性

时间:2017-03-08 17:33:00

标签: c# wpf dependency-properties

我们的模型中有很多实体关联了一些Document实体。我试图编写一个可重用的WPF控件来管理这些文档。我们的想法是,如果DooHickey实体有一个名为ServiceCoverDocuments的文档实体集合,我们可以在XAML中为DooHickey视图执行以下操作...

<controls:DocumentsList Documents="{Binding ServiceCoverDocuments, Mode=TwoWay}" />

...其中ServiceCoverDocuments将是视图模型上的INPC属性,如下所示......

private ObservableCollection<SystemDocument> _serviceCoverDocuments = new ObservableCollection<SystemDocument>();

  public ObservableCollection<SystemDocument> ServiceCoverDocuments {
    get {
      return _serviceCoverDocuments;
    }
    set {
      if (_serviceCoverDocuments != value) {
        _serviceCoverDocuments = value;
        RaisePropertyChanged();
      }
    }
  }

为了做到这一点,我向DocumentsList控件添加了一个依赖属性,如下所示......

public ObservableCollection<Document> Documents {
  get {
    return (ObservableCollection<Document>) GetValue(DocumentsProperty);
  }
  set {
    SetValue(DocumentsProperty, value);
  }
}

public static readonly DependencyProperty DocumentsProperty = DependencyProperty
  .Register("Documents",
  typeof(ObservableCollection<Document>), typeof(DocumentsList),
  new PropertyMetadata(new ObservableCollection<Document>()));

但是,set属性的Documents部分从未被调用,因此控件从不显示任何文档。

经过一番搜索,我看到帖子暗示我联系了DP的已更改事件。我修改了DP的最后一行看起来像这样......

new PropertyMetadata(new ObservableCollection<DocumentTypeInterface>(), OnDocumentsChanged));

...其中OnDocumentsChanged看起来像这样......

private static void OnDocumentsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
  DocumentsList control = (DocumentsList) d;
  control.Documents = (ObservableCollection<DocumentTypeInterface>) e.NewValue;
}

然而,这也永远不会被召唤。

我检查了所有绑定,但它们是正确的。 VS没有显示任何绑定错误,如果我将鼠标放在任何绑定上并导航到声明,它会正确导航。

我的理解是,当视图模型设置其ServiceCoverDocuments INPC属性时,将通知DooHickey视图(包含我的控件),以及Documents属性DocumentsList属性1}}控制将被绑定(ModeTwoWay所以这应该发生),然后应该在控件上设置DP。

这不会发生。我做错了什么?

修改:根据Ed Plunkett的建议(请参阅第一条评论),我将跟踪设置为高,并获得以下内容......

System.Windows.Data Warning: 56 : Created BindingExpression (hash=14431828) for Binding (hash=7284856)
System.Windows.Data Warning: 58 :   Path: 'ServiceCoverDocuments'
System.Windows.Data Warning: 61 : BindingExpression (hash=14431828): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 62 : BindingExpression (hash=14431828): Attach to VisionRT.CRM.WPF.Views.UserControls.Controls.DocumentsList.Documents (hash=12260243)
System.Windows.Data Warning: 67 : BindingExpression (hash=14431828): Resolving source 
System.Windows.Data Warning: 70 : BindingExpression (hash=14431828): Found data context element: DocumentsList (hash=12260243) (OK)
System.Windows.Data Warning: 78 : BindingExpression (hash=14431828): Activate with root item DocumentsListViewModel (hash=43041107)
System.Windows.Data Warning: 108 : BindingExpression (hash=14431828):   At level 0 - for DocumentsListViewModel.ServiceCoverDocuments found accessor <null>
System.Windows.Data Error: 40 : BindingExpression path error: 'ServiceCoverDocuments' property not found on 'object' ''DocumentsListViewModel' (HashCode=43041107)'. BindingExpression:Path=ServiceCoverDocuments; DataItem='DocumentsListViewModel' (HashCode=43041107); target element is 'DocumentsList' (Name=''); target property is 'Documents' (type 'ObservableCollection`1')
System.Windows.Data Warning: 80 : BindingExpression (hash=14431828): TransferValue - got raw value {DependencyProperty.UnsetValue}
System.Windows.Data Warning: 88 : BindingExpression (hash=14431828): TransferValue - using fallback/default value ObservableCollection`1 (hash=62777594 Count=0)
System.Windows.Data Warning: 89 : BindingExpression (hash=14431828): TransferValue - using final value ObservableCollection`1 (hash=62777594 Count=0)

如果你看,那里有一个绑定错误......

  

&#39; ServiceCoverDocuments&#39;在&#39; object&#39;上找不到的属性&#39;&#39; DocumentsListViewModel&#39;

这可能是我出错的地方,但我不确定为什么。 ServiceCoverDocuments属性不在DocumentsListViewModel(控件的VM)上,它位于VM上,用于容纳控件的视图。 Visual Studio似乎理解这一点,因为我可以从ServiceCoverDocuments属性导航到视图VM中的INPC属性。

0 个答案:

没有答案