Если я хочу получить доступ к буферу с MVVM, как я могу это сделать?Ручка копирования и вставки (буфер обмена) в MVVM
ответ
SL 4 теперь поддерживает операции текстового буфера обмена. Это прозрачно в режиме OOB и требует подтверждения пользователя, если не в режиме OOB.
Вы можете использовать Clipboard.GetText()
в ваших моделях и командах для получения текстового содержимого, доступного в буфере обмена.
В то время как вы, конечно, можете делать такие вещи, как и 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");
И создать экземпляр VM, как так:
var fooVm = new FooViewModel(clipMock.Object);
И так далее.
Я понимаю, что это древний пост, но я искал некоторые лучшие практики в Clipboard и MVVM, принял мое собственное решение, прочитав этот пост и решил поделиться. Надеюсь, кто-нибудь посчитает это полезным. :-)
Я действительно спрашиваю в приложении MVVM, где должна идти логика буфера обмена. Является ли доступ к Clipboard из моего ViewModel хорошей идеей? –
Вы имеете в виду «в отличие от этого в коде XAML позади»? Если это так, я считаю, что ответ отрицательный. Для меня кажется законным, что модель представления знает буфер обмена. –