如何使用自定义模板文件导出数据

时间:2016-10-26 15:55:00

标签: wpf mvvm

我正在尝试使用自定义模板文件找出从WPF应用程序导出数据的最佳方法,但尽管数小时的搜索已经空白。

方案如下:

我们有一个WPF MVVM应用程序供公司内部使用,其中一个视图用于生成发票。可以选择导出到此View上的Word文档,该文档目前在ViewModel中使用各种硬编码字符串文字实现,远非理想情况。

目前的设置确实有效,但对我来说感觉不对,我想改进它。我们还要求添加不同类型的发票,因此我借此机会整理一下。

导出过程当前涉及将HTML文档创建为字符串,然后将其插入到Word文档中。可能有更好的方法来做到这一点,但这超出了这个问题的范围,如果所需的最终输出是HTML,同样的问题将适用。为了简单起见,我们只是说我们对可以表示为字符串并且没有动态布局的任何类型的导出文件感兴趣,例如多行数据,即我们只是在字符串上进行查找/替换。

我想做什么:

  • 创建包含占位符的自定义模板文件
  • 在视图中指定要使用的模板
  • 使用ViewModel中的数据将数据注入模板

这是正确的方法吗?如果没有,那么什么是更好的选择呢?

模板文件应存放在何处?我认为它们将是WPF应用程序中的资源。

模板操作/数据注入应该在哪里完成?我最初假设一个字符串将被加载到ViewModel中,这将进行操作,但也许有一些更好的方法来操作View中的数据。

毕竟,让我们继续讨论实际的问题!

问题:

对于任何可以表示为字符串的给定导出文件类型,在WPF MVVM中存储模板并将数据注入其中的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

尝试并且无法将文件数据从View传递到ViewModel后,我最终传递了文件路径。然后,ViewModel使用此路径加载模板并注入数据。它不是我最初的目标,但确实有效,并且具有能够在View中指定文件路径从而使其远离ViewModel的优势。

由于Word显示嵌入图像的问题,我也使用.docx文件作为模板而不是.html。此模板文件包含在WPF项目中,其中包含内容构建操作。

查看XAML:

<Label Content="{Binding Path=InvoiceTemplateFile, FallbackValue='\\Templates\\Invoice\\InvoiceTemplate.docx', Mode=OneWayToSource}" Visibility="Collapsed" />

ViewModel属性:

    private string _invoiceTemplateFile;
    public string InvoiceTemplateFile
    {
        get { return _invoiceTemplateFile; }
        set
        {
            if (value == _invoiceTemplateFile)
                return;

            _invoiceTemplateFile = value;

            base.OnPropertyChanged("InvoiceTemplateFile");
        }
    }

访问ViewModel中的文件路径:

string templateFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, this.InvoiceTemplateFile);

我愿意接受更好的建议!