hash foo 2>/dev/null
: работает с Zsh, Bash, Dash и Ash.
type -p foo
: кажется, что он работает с zsh, bash и ash (busybox), но не с dash (интерпретирует -p
как аргумент).
command -v foo
: работает с zsh, bash, dash, но не с ash (busybox) (-ash: command: not found
).
Также обратите внимание, что builtin
недоступно с ash
и dash
.
Обычно я использую Dependency Injection, чтобы внедрить какую-то абстрактную вещь IShowTheInterface, а затем вызвать методы абстракции из Command. Затем эти методы должны дать вам ответы, необходимые для определения того, следует ли вообще продолжать действие, и какие данные ввел пользователь.
Недавно я использовал это в качестве примера в сообщении блога с небольшим другая тема .
Такие вещи (диалоги подтверждения, диалоги открытия файлов и т. Д.) Обычно используются приложениями совместно. Поэтому я предпочитаю вообще не помещать их в ViewModel.
ViewModel зависит от приложения, и не рекомендуется бесконечно расширять ViewModelBase. Вместо этого создайте поведения, которые можно использовать повторно, чтобы расширить представление. Есть несколько примеров поведения в галерее смешения выражений
РЕДАКТИРОВАТЬ:
Поведение может иметь свойства, и вы можете использовать эти свойства не только для определения характеристик поведения, но и для получения обратной связи:
<Button Content="Open Document">
<i:Interaction.Behaviors>
<local:FileOpenBehavior
FileNameTarget="{Binding ElementName=tbDocName}"/>
</i:Interaction.Behaviors>
</Button>
В приведенном выше примере tbDocName можно скрыть или привязать к свойству ModelView.