早上好!
我有一个 WPF 应用程序,它将根据它收到的命令行参数显示许多不同的文件类型。它工作正常,但我想回去重构它。我只做了几年的开发人员,想掌握 MVVM。
我正在使用一个名为 Stylet 的 MVVM 设计包。在我的 PDF 视图中,我使用 Telerik RadPdfViewer 控件,Telerik 为您内置了所有这些绑定内容。例如,我使用它们预先配置的命令绑定将右键单击上下文菜单与命令“全选”和“复制”绑定在一起。
我想将“文档源”属性绑定到我的视图模型,以便我可以传入我想要加载的文档的路径。但是,控件的 DataContext 绑定到 Telerik 的 CommandDescriptors,阻止绑定到我的视图模型。
<telerik:RadPdfViewer x:Name="radPdfViewer" Grid.Row="1"
DataContext="{Binding CommandDescriptors, ElementName=radPdfViewer}"
DocumentSource="{Binding PDFDoc}"
telerik:RadPdfViewerAttachedComponents.RegisterFindDialog="True"
HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch"
telerik:StyleManager.Theme="Office_Black" Grid.ColumnSpan="2">
<telerik:RadContextMenu.ContextMenu>
<telerik:RadContextMenu>
<telerik:RadMenuItem Header="Select All"
Command="{Binding SelectAllCommandDescriptor.Command}" />
<telerik:RadMenuItem Header="Copy"
Command="{Binding CopyCommandDescriptor.Command}" />
</telerik:RadContextMenu>
</telerik:RadContextMenu.ContextMenu>
</telerik:RadPdfViewer>
public class PDFViewModel
{
private string _pdfDoc;
public string PDFDoc
{
get
{
return _pdfDoc;
}
set
{
_pdfDoc = value;
}
}
public PDFViewModel()
{
PDFDoc = @"t:\share\large.pdf";
}
}
我看到两个选择
我打破了 Telerik 的预构建命令绑定,并弄清楚如何将全选和复制功能引入我的视图模型。
Stylet 有一个 s:Action 函数,我可以在其中调用一个方法,我可以使用 C# 将文档加载到 RadPdfViewer 控件中。我需要以某种方式在我的视图模型的方法中控制 gui 控件,但我不知道该怎么做。
有没有更好的办法?将不胜感激朝正确方向稍加推动。
答案 0 :(得分:0)
Jason Tyler 的回复让我朝着正确的方向前进。谢谢!
所以因为我使用的是 ViewModel first 模式,所以我不需要像我想的那样指定用户控件的 DataContext...它已经设置了。
但是,他建议使用相对源进行绑定并研究如何执行此操作(我以前从未使用过相对源......我对这个东西有点陌生)我遇到了这篇 Stack 帖子
How do I use WPF bindings with RelativeSource?
使用它,我能够弄清楚语法,我的文档就出来了,我仍然可以使用绑定到 Telerik 的右键单击上下文菜单项。所以现在我的 Xaml 看起来像这个注释文档源绑定是如何改变的。
<telerik:RadPdfViewer x:Name="radPdfViewer" Grid.Row="1"
DataContext="{Binding CommandDescriptors, ElementName=radPdfViewer}"
DocumentSource="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=DataContext.PDFDoc}"
telerik:RadPdfViewerAttachedComponents.RegisterFindDialog="True"
HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch"
telerik:StyleManager.Theme="Office_Black" Grid.ColumnSpan="2">
<telerik:RadContextMenu.ContextMenu>
<telerik:RadContextMenu>
<telerik:RadMenuItem Header="Select All"
Command="{Binding SelectAllCommandDescriptor.Command}" />
<telerik:RadMenuItem Header="Copy"
Command="{Binding CopyCommandDescriptor.Command}" />
</telerik:RadContextMenu>
</telerik:RadContextMenu.ContextMenu>
</telerik:RadPdfViewer>