Если я хочу получить доступ к буферу обмена с помощью MVVM, как я могу это сделать?
Обработка копирования и вставки (буфер обмена) в MVVM
Ответы (2)
SL 4 теперь поддерживает операции с текстовым буфером обмена. Это прозрачно в режиме OOB и требует подтверждения пользователя, если не в режиме OOB.
Вы можете использовать Clipboard.GetText() в своих моделях представлений и командах для извлечения текстового содержимого, доступного в буфере обмена.
Хотя вы, безусловно, можете делать такие вещи, как 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();
}
}
Затем вы можете ссылаться на него как на свойство вашей виртуальной машины следующим образом:
public IClipboardService ClipboardService { get; set; }
И либо установите его непосредственно как свойство, либо включите его в свой конструктор:
public FooViewModel(IClipboardService service) {
ClipboardService = service;
}
И когда вам это нужно, вместо прямого вызова Clipboard.SetText вы можете вместо этого использовать ClipboardService.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, принял собственное решение, читая этот пост, и решил поделиться. Надеюсь, кто-то найдет это полезным. :-)