如果我想使用MVVM访问剪贴板,我该怎么办?
答案 0 :(得分:3)
虽然您可以在VM中执行Clipboard.SetText
和Clipboard.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()
来检索剪贴板中可用的文本内容。