我们的模型中有很多实体关联了一些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}}控制将被绑定(Mode
是TwoWay
所以这应该发生),然后应该在控件上设置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属性。