WPF команды и параметры - PullRequest
       18

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

4 голосов
/ 30 сентября 2008

Я считаю, что параметры команды 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).

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

Ответы [ 4 ]

2 голосов
/ 01 октября 2008

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

1 голос
/ 15 марта 2009

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

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

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

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

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

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

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

1 голос
/ 15 октября 2008

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

0 голосов
/ 30 сентября 2008

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

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

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