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";
    }
}

我看到两个选择

  1. 我打破了 Telerik 的预建命令绑定并弄清楚如何将 select 全部和复制功能带到我的视图模型中。

  2. 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>