2013-04-15 2 views
0

Этот вопрос прост, но я не могу точно понять, как это сделать.В любом случае, чтобы отключить команду не через viewmodel в wpf?

Я решил использовать WPF, но я не хочу реализовывать некоторые из шаблонов MVVM классическим способом.

В моем проекте я решил создать свои модели с INPC и использовать их в качестве корма для моего XAML, как если бы они были View-модель, а .. так вместо того, чтобы:
View (< -Binding->) View-модели (< -INPC ->) Модель

, что я проектировал это:
View (< -связывающего ->) Модель.

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

Я хочу также поддерживать команды, мне нравится концепция команд, и я понимаю, как реализовать команды при использовании модели представления. однако, как я описал, я решил пропустить модель представления.

Так обеспечивая я команда записывается следующим образом:

public class MyCommand : ICommand 
{ 
    public event EventHandler CanExecuteChanged; 

    public void Execute(object parameter) 
    { 
    //do somthing 
    } 

    public bool CanExecute(object parameter) 
    { 
     return true; 
    } 
} 

И что мой XAML выглядит Somthing так:

<UserControl x:Class=... blah blah... 
xmlns:Model="clr-namespace:MyProject.BusinessLogic.Person" 
xmlns:Commands="clr-namespace:MyProject.Commands"> 

<TextBox Text="{Binding FirstName}" /> 
<Button Command="What do I put here?" /> 

<UserControl> 

Итак, что я ставлю в команде кнопку, чтобы позволить ему invoke MyCommand (что нет в модели)?

+1

Plump a command? Является ли терминология такой странной в наши дни? – siride

+0

lol, извините, я исправлю это - я имел в виду Plumb :) –

+0

Это кажется довольно странным, конечно, любое командование связано с логикой представления, а модель представления - это именно то место, где можно поставить эту логику – devdigital

ответ

1

Вам нужна модель просмотра, и именно там должна идти ваша логика представления, включая команду.

Ваши модели, очевидно, не могут иметь никаких ссылок на ICommand и т. Д., Поскольку они находятся в пространстве имен System.Windows.Input, поэтому вам нужен тип, который соединяет модель с видом, который является моделью представления.

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

Другое соображение заключается в том, что если вы делаете MVVM, то вы really should be using an MVVM framework. Они предоставят альтернативу командованию, у которого есть ограничения.

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

Рамка MVVM, такая как Caliburn.Micro, обеспечивает Actions, что обеспечивает множество преимуществ перед командованием.

+0

На самом деле, если вы хотите скрыть отключенную кнопку, вы можете легко достичь этого с помощью триггера в зависимости от IsEnabled = false. В этом случае не имеет значения, как кнопка была отключена. – hbarck

+1

Что делать, если вы хотите, чтобы кнопка была включена, но появилось диалоговое окно, когда оно было нажато, чтобы сказать, что действие невозможно? – devdigital

+0

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

1

Вы можете прочитать: http://wpfglue.wordpress.com/2012/05/07/commanding-binding-controls-to-methods/

Идея заключается в том, чтобы повторно используемые компоненты, которые позволяют создать CommandBinding, который вызывает метод в модели, и могут быть настроены в XAML. Таким образом, «сантехника» будет выполняться этими компонентами, в то время как Модель будет применять только методы, связанные с бизнесом.

Это может быть обобщено на то, что я называю ViewModelKit, то есть набором компонентов, которые могут быть собраны в качестве ресурсов в XAML и охватывают общие задания ViewModel.