Обработка копирования и вставки (буфер обмена) в MVVM

Если я хочу получить доступ к буферу обмена с помощью MVVM, как я могу это сделать?


person Jiew Meng    schedule 14.10.2010    source источник


Ответы (2)


SL 4 теперь поддерживает операции с текстовым буфером обмена. Это прозрачно в режиме OOB и требует подтверждения пользователя, если не в режиме OOB.

Вы можете использовать Clipboard.GetText() в своих моделях представлений и командах для извлечения текстового содержимого, доступного в буфере обмена.

person vc 74    schedule 14.10.2010
comment
На самом деле я спрашиваю в приложении MVVM, куда должна идти логика буфера обмена. Является ли доступ к буферу обмена из моей ViewModel хорошей идеей? - person Jiew Meng; 14.10.2010
comment
Вы имеете в виду «в отличие от того, чтобы делать это в коде XAML позади»? Если да, то я считаю, что ответ - нет. Мне кажется законным, что модель представления знает о буфере обмена. - person vc 74; 14.10.2010

Хотя вы, безусловно, можете делать такие вещи, как 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, принял собственное решение, читая этот пост, и решил поделиться. Надеюсь, кто-то найдет это полезным. :-)

person Mike Loux    schedule 30.08.2016
comment
Спасибо, что поделился. Зачем нам нужно реализовывать этот интерфейс? Как это помогает в модульном тестировании? - person Ehsan; 08.05.2019
comment
Рад, что вы спросили. Если тестируемый метод вызывает буфер обмена, что потенциально может повлиять на результат теста, вам не нужно беспокоиться о чем-либо еще, что может повлиять на содержимое буфера обмена во время выполнения теста. Обернув это в службу, реализующую интерфейс, вы можете точно контролировать то, что находится в вашем буфере обмена во время ваших модульных тестов, потому что вас больше интересует тестирование того, что виртуальная машина делает с данными буфера обмена, чем сама фактическая функциональность буфера обмена (которая, предположительно работает, поскольку является частью .NET Framework). ХТХ! - person Mike Loux; 10.05.2019