WPF数据绑定失效问题:RadPdfViewer无法加载PDF文件
我一眼就发现了问题所在——你在RadPdfViewer的XAML代码里覆盖了它的DataContext,导致绑定找不到PathOfPdf属性!
问题根源
你给RadPdfViewer设置了DataContext="{Binding CommandDescriptors, ElementName=pdfViewer}",这会把该控件的上下文从你的Page2实例切换成它自身的CommandDescriptors对象。而CommandDescriptors里根本没有PathOfPdf这个属性,所以DocumentSource="{Binding Path=PathOfPdf}"自然无法生效。
解决办法
有两种方案可以选择,根据你的实际需求来选:
方案一:移除多余的DataContext设置(推荐)
如果你的场景不需要自定义命令逻辑,完全可以删掉RadPdfViewer上的DataContext属性,让它继承Page2的上下文。修改后的RadPdfViewer代码如下:
<telerik:RadPdfViewer x:Name="pdfViewer" DocumentSource="{Binding Path=PathOfPdf, Mode=TwoWay}" telerik:RadPdfViewerAttachedComponents.RegisterSignSignatureDialog="True" telerik:RadPdfViewerAttachedComponents.RegisterFindDialog="True" Grid.Row="2" telerik:RadPdfViewerAttachedComponents.RegisterSignaturePropertiesDialog="True" telerik:RadPdfViewerAttachedComponents.RegisterContextMenu="True"/>
这样控件就能正确绑定到Page2里的PathOfPdf属性了。
方案二:指定绑定的相对源(如果需要保留CommandDescriptors)
如果你确实需要使用CommandDescriptors作为控件的DataContext,那可以给DocumentSource的绑定指定相对源,让它找到Page2的上下文:
<telerik:RadPdfViewer x:Name="pdfViewer" DocumentSource="{Binding Path=DataContext.PathOfPdf, RelativeSource={RelativeSource AncestorType=Page}, Mode=TwoWay}" DataContext="{Binding CommandDescriptors, ElementName=pdfViewer}" telerik:RadPdfViewerAttachedComponents.RegisterSignSignatureDialog="True" telerik:RadPdfViewerAttachedComponents.RegisterFindDialog="True" Grid.Row="2" telerik:RadPdfViewerAttachedComponents.RegisterSignaturePropertiesDialog="True" telerik:RadPdfViewerAttachedComponents.RegisterContextMenu="True"/>
这里通过RelativeSource向上查找Page类型的祖先,从而获取到Page2的DataContext,进而找到PathOfPdf属性。
另外,检查了你的后台代码,INotifyPropertyChanged的实现是正确的,属性变更通知没问题,所以只要修正DataContext的问题,绑定就能正常工作啦!
内容的提问来源于stack exchange,提问作者user9821580

