WPF命令DependencyProperty

时间:2017-01-26 10:21:28

标签: c# wpf pdf mvvm command

我正在构建一个WPF包装器来使用Acrobat显示PDF(来自this CodePlex项目)

Codeplex项目在PDF Viewer上执行基本功能时提供了足够的样本,但缺乏WPF MVVM模式的功能。我的WPF包装器必须使用Xaml中的Binding来公开依赖项属性以修改Acrobat PDF Viewer的行为。

正常绑定到文件名,PageNumber等属性是正常的,因为我正在执行以下操作:

  1. 创建依赖属性(可以从codeplex项目中相对容易地实现)

    public static readonly DependencyProperty PdfPathProperty =
         DependencyProperty.Register("PdfPath", typeof(string), typeof(PdfViewer), new UIPropertyMetadata(null, LoadPDF));
    
    
    public string PdfPath {
        get {
            return (string)GetValue(PdfPathProperty);
        }
        set {
            SetValue(PdfPathProperty, value);
        }
    }
    
    private static void LoadPDF(DependencyObject d, DependencyPropertyChangedEventArgs e) {
        var control = d as PdfViewer;
        if (control == null) return;
        control.LoadFile();
    }
    
    private void LoadFile() {
        _winFormPdfHost.LoadFile(PdfPath);
    }
    
  2. 使用UserControl的位置,绑定到依赖项属性:

        <viewer:PdfViewer x:Name="viewer" PdfPath="{Binding FileName}" 
                          ShowToolbar="{Binding ShowToolbar, UpdateSourceTrigger=PropertyChanged}"
                          PageNumber="{Binding PageNumber, UpdateSourceTrigger=PropertyChanged}">
        </viewer:PdfViewer>
    
  3. 这一切都按预期工作。但是,我需要以某种方式将命令传递给Wrapper。例如,我需要触发一个动作/命令,例如&#39; GoToFirstPage&#39;,这就是我被困住的地方。

    我想做以下事情:

            <viewer:PdfViewer x:Name="viewer" PdfPath="{Binding FileName}" 
                              ShowToolbar="{Binding ShowToolbar, UpdateSourceTrigger=PropertyChanged}"
                              PageNumber="{Binding PageNumber, UpdateSourceTrigger=PropertyChanged}"
                              FirstPageCommand="{Binding GoToFirstPageCommand}">
            </viewer:PdfViewer> 
    

    然而,这种方法不起作用,因为我不想在ViewModel中实现该命令的功能。我只想在Wrapper中执行该功能。

    我基本上想要构建一个自定义工具栏来满足逻辑,而不是使用Acrobat提供的工具栏,我需要能够以某种方式从外部传递或触发包装器中的命令。

    修改

    我可以通过忽略MVVM来实现这一点,并且只从Wrapper中公开一个公共方法:

    1. 在包装器中 - 删除命令的依赖属性,只显示该函数:

      public void GoToFirstPage() {
          _winFormPdfHost.GoToFirstPage();
      }
      
    2. 从ViewModel,通过UserControl访问该方法

      private ICommand _FirstPageCommand;
      public ICommand FirstPageCommand {
          get {
              if (_FirstPageCommand == null) {
                  _FirstPageCommand = CreateCommand(GoToFirstPage);
              }
              return _FirstPageCommand;
          }
      }
      
      public void GoToFirstPage(object obj) {
          var viewer = obj as WPFPdfViewer.PdfViewer;
          viewer.GoToFirstPage();
      }
      
    3. 将包装器作为命令参数:

          <Button VerticalAlignment="Center" Content="First" Padding="10,5,10,5" Margin="5" Command="{Binding FirstPageCommand}" CommandParameter="{Binding ElementName=viewer}"/>
      

0 个答案:

没有答案