Как выполнять команды?с помощью метода синглтон утилиты или через OnPropertyChanged? - PullRequest
0 голосов
/ 01 декабря 2011

Предположим, что один из ViewModel получит некоторую команду, которая является довольно общей для приложения (и может также выполняться из других ViewModel, например, "stop ftp server"). Что мне делать?

  • распространить OnPropertyChanged событие на контейнер, выполнить команду в каком-либо представлении верхнего уровня (MainWindowViewModel)
  • передать некоторый класс "singleton service layer" каждому ViewModel, выполнить статический метод непосредственно в ViewModel, например Utils.StopFtpServer()
  • другой

Ответы [ 4 ]

1 голос
/ 01 декабря 2011

Если вы хотите сделать что-то по-MVVM, то вам не следует вставлять это в View, View Model, статический метод или Singleton.

FTP-сервер должен быть полноценнымКласс модели.

  • Представление должно сообщить модели представления, что оно хочет выполнить StopFtpServerCommand
  • Представление модели должно сообщить экземпляру FtpServer, что FTP-сервер должен Stop

Это означает, что вы будете поддерживать несколько экземпляров FTP-серверов, даже если вы не будете предоставлять эту поддержку через пользовательский интерфейс.

Если вы пойдете по этому пути, вы избежитезаглядывая в угол в будущем, когда вы решите, что вам нужно несколько FTP-серверов.Это заставит вас написать лучшую абстракцию для вашего класса, так что вы с большей вероятностью будете использовать ее в будущих программах.

Это также не должно быть очень сложным в написании по сравнению с написанием Singleton или статическихметоды.

Если вам нужен доступ к одному и тому же экземпляру из нескольких моделей представлений (что, по-видимому, не требуется для вашего вопроса), это отдельная задача.Я лично предлагаю использовать такие вещи, как Внедрение зависимостей , чтобы решить эту проблему, чтобы вы не звонили new FtpServer() изнутри ваших View Models.

1 голос
/ 01 декабря 2011

Статические команды используются Microsoft.Поэтому не может быть плохой идеей использовать статический класс, который определяет все эти глобальные команды.

Чтобы привести пример того, что я сказал:

    EditingCommands.AlignLeft

Это статический класс, который предлагает команду global , используемую для текстового издания.

Тем не менее, я рекомендую избегать использования бизнес-логики в командах.Инкапсулируйте его в бизнес-объекты и вызывайте эти объекты из команды.Таким образом вы отделите Gui и Business и получите более тестируемое приложение.

0 голосов
/ 01 декабря 2011
<Button Command="{Binding {x:Static business:MyStaticClass.MyStaticCommand}}" />

Что-то подобное? Предполагая, что у вас есть логика в MyStaticClass, которая должна быть на бизнес-уровне

0 голосов
/ 01 декабря 2011

Из двух ходят с распространением события.Синглтон - это тестовая недружественная конструкция, и вам действительно не нужно тестировать недружественную функцию - например, остановку или запуск какой-либо службы.внутри таких конструкций.

Этот ответ никак не связан с MVVM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...