2008-09-30 3 views
4

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

Я собрал систему для executing commands asynchronously, но трудно использовать все, что требует ввода данных. Я знаю, что один общий шаблон с командами WPF должен пройти в 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).

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

+0

Я не понимаю, почему это проблема. Я использовал WPF как это, потому что я помню, как его можно использовать. Это также означает, что вы можете повторно использовать конвертер с различными источниками для данных, когда захотите, и не привязаны к типу `this`. Можете ли вы объяснить, почему вы считаете, что это неправильно? – 2008-10-15 08:19:54

ответ

0

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

Действительно, вам следует оставить команды синхронными и выполнить их асинхронно, выкинув новый поток или передав их в диспетчер команд (home rollled).

+0

Я не уверен, что я считаю, что улучшение должно дублировать код CanExecute и обработки исключений в каждой команде команды, которую я создаю. Спасибо, хотя. – nedruod 2008-09-30 05:49:50

2

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

+0

Прошло какое-то время, но я не думаю, что вы не возражаете расширить это за пределами ссылки только ответ? – 2015-03-18 01:10:51

1

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

+0

Сначала ваше предложение звучало как очень хорошая идея, но потом я понял, что, хотя это очень хорошее предложение для синхронных команд, это плохая идея передать общий (глобальный) объект асинхронному методу, потому что он может изменить середину, выполнение. – nedruod 2008-10-23 06:04:49

1

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

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

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

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

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

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

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

Смежные вопросы