处理副本&在MVVM中粘贴(剪贴板)

时间:2010-10-14 10:08:45

标签: c# wpf mvvm clipboard copy-paste

如果我想使用MVVM访问剪贴板,我该怎么办?

2 个答案:

答案 0 :(得分:3)

虽然您可以在VM中执行Clipboard.SetTextClipboard.GetText之类的操作,但如果您是MVVM纯粹主义者(像我一样),那么我建议创建一个ClipboardService(具有适当的接口,所以你可以在单元测试中模拟它。如下所示:

using System.Windows;

public class ClipboardService : IClipboardService
{
    public void SetText(string value)
    {
        Clipboard.SetText(value);
    }

    public string GetText()
    {
        return Clipboard.GetText();
    }
}

然后您可以将其作为VM中的属性引用,如下所示:

public IClipboardService ClipboardService { get; set; }

要么将其直接设置为属性,要么将其包含在构造函数中:

public FooViewModel(IClipboardService service) {
    ClipboardService = service;
}

当您需要它时,您可以使用ClipboardService.SetText代替直接调用Clipboard.SetText。你可以(如前所述)在单元测试中模拟它。所以,如果你使用Moq(就像我一样),你可能会有类似的东西:

Mock<IClipboardService> clipMock = new Mock<IClipboardService>();
clipMock.Setup(mock => mock.GetText(It.IsAny<string>())).Returns("Foo");

像这样实例化你的虚拟机:

var fooVm = new FooViewModel(clipMock.Object);

等等。

我意识到这是一篇古老的帖子,但我正在寻找剪贴板和MVVM的一些最佳实践,在阅读这篇文章时做出了自己的决定并决定分享。希望有人觉得它很有用。 : - )

答案 1 :(得分:1)

SL 4现在支持文本剪贴板操作。这在OOB模式下是透明的,如果不是在OOB模式下则需要用户确认。

您可以在视图模型和命令中使用Clipboard.GetText()来检索剪贴板中可用的文本内容。