Команды и параметры WPF

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

Я собрал систему для асинхронное выполнение команд, но сложно использовать что-либо, требующее ввода данных. Я знаю, что один общий шаблон с командами WPF - передать this. Но this вообще не будет работать с асинхронными командами, потому что тогда все свойства зависимостей будут недоступны.

Я получаю такой код:

<Button Command = "{Binding ElementName=servicePage, Path=InstallServiceCommand}">
  <Button.CommandParameter>
     <MultiBinding Converter = "{StaticResource InstallServiceParameterConverter}">
        <MultiBinding.Bindings>
           <Binding ElementName = "servicePage" Path = "IsInstalled"/>
           <Binding ElementName = "localURI" Path = "Text"/>
           <Binding ElementName = "meshURI" Path = "Text"/>
           <Binding ElementName = "registerWithMesh" Path = "IsChecked"/>
         </MultiBinding.Bindings>
      </MultiBinding>
  </Button.CommandParameter>
</Button>

а также нужен класс InstallServiceParametersConverter (плюс InstallServiceParameters).

Кто-нибудь видит очевидный способ улучшить это?

Я не понимаю, почему это проблема. Я использовал WPF вот так, сколько себя помню. Это также означает, что вы можете повторно использовать конвертер с разными источниками данных в любое время и не привязаны к типу this. Можете ли вы пояснить, почему вы считаете, что это неправильно?

Omer van Kloeten 15.10.2008 12:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
1
22 134
4

Ответы 4

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

На самом деле вам следует оставить команды синхронными и выполнять их асинхронно, отбрасывая новый поток или передавая их диспетчеру команд (начальный этап).

Я не уверен, что считаю улучшением дублирование кода CanExecute и обработки исключений в каждой создаваемой мной команде. Спасибо хоть.

nedruod 30.09.2008 09:49

Позвольте мне указать вам на мой проект с открытым исходным кодом Caliburn. Вы можете найти его на здесь. Функция, которая в наибольшей степени поможет решить вашу проблему, кратко задокументирована здесь

Прошло некоторое время, но я не думаю, что вы не возражаете расширить это за рамки ответа только по ссылке?

Nathan Tuggy 18.03.2015 04:10

Команды предназначены для того, чтобы избежать тесной связи между вашим пользовательским интерфейсом и логикой программы. Здесь вы пытаетесь обойти это, поэтому вам будет больно. Вы хотите, чтобы ваш пользовательский интерфейс был привязан к какому-либо другому объекту (который содержит эти данные), и тогда ваша команда может просто вызвать этот объект. Попробуйте поискать MV-V-M или посмотрите пример PRISM.

Сначала ваше предложение звучало как очень хорошая идея, но затем я понял, что, хотя это очень хорошее предложение для синхронных команд, передавать общий (глобальный) объект асинхронному методу - плохая идея, потому что это может изменить промежуточное выполнение. .

nedruod 23.10.2008 10:04

Попробуйте использовать что-то вроде MVVM:

Создайте класс, в котором хранятся все данные, отображаемые в текущем «представлении» (окно, страница, все, что имеет смысл для вашего приложения).

Привяжите свой элемент управления к экземпляру этого класса.

Пусть класс предоставит некоторые свойства ICommand, свяжите свойство Command кнопки с соответствующим свойством в классе данных, вам не нужно устанавливать параметр команды, потому что все данные уже были переданы объекту с использованием обычной повседневной привязки данных.

У вас есть производный класс ICommand, который обращается к вашему объекту, посмотрите на эту ссылку для нескольких реализаций:

http://dotnet.org.za/rudi/archive/2009/03/05/the-power-of-icommand.aspx

Внутри метода, вызываемого командой, упакуйте все необходимые данные и отправьте их в фоновый поток.

Другие вопросы по теме