2015-10-13 2 views
0

Мне нужно несколько ответов здесь, так как они не могут найти много онлайн, которые отвечают на мои вопросы. По моему мнению, для выполнения рабочего процесса MVVM при кодировании приложения WPF данные, логика и пользовательский ввод должны быть отдельными.MVVM и пользовательские команды?

Итак, чтобы следовать этой логике, я предполагаю, что создаю папку под названием что-то вроде Classes, а затем создадим файл класса с именем Commands.cs.

Commands.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Duplicate_Deleter.Classes 
{ 
    class WindowCommands 
    { 

    } 
    class DatabaseCommands 
    { 

    } 
    class OtherCommands 
    { 

    } 
} 

Тогда я получил ссылку на этот файл класса в моем XAML так что мое окно ввода пользователь знает, что команда правильно?

<Window 
xmlns:local="clr-namespace:Classes.Commands"> 
</Window> 

Тогда, конечно, я бы настройки команды, чтобы знать, какой метод использовать для каждого состояния, например:

<Window.CommandBindings> 
     <CommandBinding Command="WindowCommands.WindowClose" Executed="CloseWindow_Executed" CanExecute="CloseWindow_CanExecute" /> 
     <CommandBinding Command="WindowMinimize" Executed="CloseWindow_Executed" CanExecute="CloseWindow_CanExecute" /> 
    </Window.CommandBindings> 

Могу ли я думать прямо здесь? Может ли кто-нибудь прояснить это или объяснить, как делать то, что я пытаюсь, если я делаю это неправильно?

+0

Вы имеете в виду MVVM, не MVVP, правильно? Иначе что такое MVVP? –

+0

Crap да! Сожалею! lol –

+0

Я не знаю, где вы получили эту информацию, но я бы посоветовал никогда не возвращаться в эти места. – Will

ответ

2

Martyn,

Давайте проясним ситуацию.

Команды являются важной частью MVVM.

Но большую часть времени Команды (исполнители ICommand) являются свойствами объекта ViewModel.

public class MyViewModel{ 
    public ICommand SaveCmd { get; set; } 
} 

CommandSources как кнопки и MenuItems связывается с командами:

<Button Command="{Binding SaveCmd}" Content="Save" /> 

ICommmand содержит два метода:

  1. недействительного Execute (...) - то, что они делают
  2. Его CanExecute (...) - рассказать графическому интерфейсу, чтобы отключить кнопки, пункты меню, ...

Команды находятся на стороне ViewModel, поэтому они могут легко адаптировать данные для представления, быть отключенными, если данные неверны для команды, которая будет выполнена.

Все, что вы показываете: CommandBindings, интересно, но реже используется.

  • С CommandBindings вы можете прикрепить код на GUI стороне все обратные вызовы (расстрелянных, PreviewExecutes, CanExecute, PreviewCanExecute)

  • Вы также можете связать некоторые входные жесты (клавиатуры или) мышь, соответствующая команды с InputBindings

  • Есть некоторые предопределенные команды, такие как ApplicationCommands (Save, New, ...), но вам нужно определить поведение, что они делают.

  • Интересной стороной этих CommandBindings является то, что они «туннелируют» от корня вашей иерархии (окна) до цели и «пузыря» к корню.
    Crossing каждый уровень в иерархии (Grid, StackPanel, ListBox ...), событие может быть обработаны (и остановился) на любом уровне

Надеется, что это помогает, считает

+0

это хороший способ сделать то, что я после? http://www.codeproject.com/KB/WPF/CentralizingWPFCommands.aspx?display=Print –

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