1 控件,两个独立的绑定源
1 Control, two separate binding sources
早上好!
我有一个 WPF 应用程序,它会根据接收到的命令行参数显示许多不同的文件类型。它工作正常,但我想回去重构它。我才做了几年开发人员,想掌握 MVVM。
我正在使用一个名为 Stylet 的 MVVM 设计包。在我的 PDF 视图中,我使用的是 Telerik RadPdfViewer 控件,Telerik 为您内置了所有这些绑定内容。例如,我使用预先配置的命令绑定将右键单击上下文菜单与命令“select all”和“复制”绑定在一起。
我想将“文档源”属性 绑定到我的视图模型,这样我就可以传入要加载的文档的路径。但是,控件的 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 的预建命令绑定并弄清楚如何将 select 全部和复制功能带到我的视图模型中。
Stylet 有一个 s:Action 函数,我可以在其中调用一个方法,在该方法中我可以使用 C# 将文档加载到 RadPdfViewer 控件中。我需要以某种方式在我的视图模型的方法中控制 gui 控件,但我不确定该怎么做。
有没有更好的方法?将不胜感激朝着正确的方向稍微推动一下。
Jason Tyler 的回复让我朝着正确的方向前进。谢谢!
因为我使用的是 ViewModel 优先模式,所以我不需要像我想的那样指定用户控件的 DataContext...它已经设置好了。
但是,他建议使用相对源进行绑定并研究如何做到这一点(我以前从未使用过 RelativeSource..我对这个东西有点陌生)我遇到了这个 Stack post
How do I use WPF bindings with RelativeSource?
Jeff Knight 发布了祖先绑定工作原理图。
使用它,我能够弄清楚语法,我的文档就出现了,我仍然可以使用绑定到 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>
早上好!
我有一个 WPF 应用程序,它会根据接收到的命令行参数显示许多不同的文件类型。它工作正常,但我想回去重构它。我才做了几年开发人员,想掌握 MVVM。
我正在使用一个名为 Stylet 的 MVVM 设计包。在我的 PDF 视图中,我使用的是 Telerik RadPdfViewer 控件,Telerik 为您内置了所有这些绑定内容。例如,我使用预先配置的命令绑定将右键单击上下文菜单与命令“select all”和“复制”绑定在一起。
我想将“文档源”属性 绑定到我的视图模型,这样我就可以传入要加载的文档的路径。但是,控件的 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 的预建命令绑定并弄清楚如何将 select 全部和复制功能带到我的视图模型中。
Stylet 有一个 s:Action 函数,我可以在其中调用一个方法,在该方法中我可以使用 C# 将文档加载到 RadPdfViewer 控件中。我需要以某种方式在我的视图模型的方法中控制 gui 控件,但我不确定该怎么做。
有没有更好的方法?将不胜感激朝着正确的方向稍微推动一下。
Jason Tyler 的回复让我朝着正确的方向前进。谢谢!
因为我使用的是 ViewModel 优先模式,所以我不需要像我想的那样指定用户控件的 DataContext...它已经设置好了。
但是,他建议使用相对源进行绑定并研究如何做到这一点(我以前从未使用过 RelativeSource..我对这个东西有点陌生)我遇到了这个 Stack post
How do I use WPF bindings with RelativeSource?
Jeff Knight 发布了祖先绑定工作原理图。
使用它,我能够弄清楚语法,我的文档就出现了,我仍然可以使用绑定到 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>