2013-08-07 2 views
2

На мой первый проект пробуя Caliburn.Micro, я люблю много вещей :-)Command класс Caliburn Micro

Одна вещь, я скучаю (или havn't обнаружил еще), как отделить ViewModel и команду. CM не поддерживает ICommand, так как это способ делать вещи superior. Я уверен, что это правда, поэтому мне хотелось бы немного толкнуть в правильном направлении, чтобы достичь этого или, возможно, найти лучший способ.

Как я понимаю, вы должны поместить метод «Выполнить» и свойство «CanExecute» непосредственно в viewmodel, названный так, чтобы он соответствовал элементу управления в представлении, чтобы заставить магию работать.

Я хотел бы поставить «Execute» и «CanExecute» в другой объект, который является свойством в viewmodel, а затем CM автоматически привязывается к этому объекту, используя обычно имя элемента управления и имена свойств.

Repost от форума на Caliburn Micro, у меня не было ответов, поэтому я стараюсь здесь.

+0

Можете ли вы, пожалуйста, более четко рассказать о том, с чем вы смущены или вам нужна дополнительная информация? Я полностью не понимаю ваш вопрос, особенно последнюю часть о том, как поставить «Execute» и «CanExecute» в другой объект? –

+0

Похоже, вы хотите создать тип обработчика команд, который будет использоваться в качестве источника привязки для ваших команд. Есть ли причина, по которой вы хотите сделать это, просто используя соглашения CM и методы/реквизиты непосредственно на виртуальной машине? Можете ли вы дать некоторые преимущества этого? – Charleh

+0

Моя причина для этого - избегать толстых ViewModels. – Karsten

ответ

1

Чтобы избежать жира ViewModels, вам также необходимо избегать толстых видов. Caliburn.Micro позволяет создавать представления/ViewModels, как описано в экранах , Conductors and Composition.

В короткой версии вы можете включить пару «DetailView» и «DetailViewModel» в оболочку «MasterView»/«MasterViewModel», указав свойство MasterViewModel с параметром DetailViewModel и добавив ContentControl, названный в честь его в MasterView. Связывание и действия работают как обычно, поэтому вы избегаете как жирных моделей/представлений, так и маршрутизации команд.

Другой вариант - привязать элемент MasterView к свойству или действию DetailViewModel, добавив свойство детали к имени цели. Я еще не могу найти конкретный URL, поэтому пример из памяти.

Предполагая, что вы следующие классы:

public class MasterViewModel:Screen 
{ 
    public property DetailViewModel MyDetails{get;set;} 
} 

и

public class DetailViewModel:Screen 
{ 
    public property string SomeText{get;set;} 

    public void DoTheBoogie(){} 
} 

Вы можете добавить элемент управления в вас MasterView с именем 'MyDetails_SomeText' связываться с DetailViewModel.SomeText. Вы также можете привязать к DoTheBoogie таким же образом.

Я предпочитаю создать отдельный просмотр, хотя и названный DetailView, и добавить ContentControl с именем «MyDetails» в MasterView.Это приводит к более чистому и более модульному дизайну.

1

Вам следует попытаться избежать аннулирования Law of Demeter. Таким образом, на вашу модели представления вы можете иметь метод выполнения, и свойство CanExecute (обычно вычисленные), и они могут позвонить в вмещающей модель, где это необходимо, например:

public void Save 
{ 
    // .. save logic 
} 

public bool CanSave 
{ 
    get 
    { 
     return this.model.CanSave ... and other logic etc. 
    } 
} 

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

public void CodeThatGetsRunWhenAPropertyOfTheModelChanges() 
{ 
    this.NotifyOfPropertyChanged(() => this.CanSave); 
} 

Если у вас есть, например, a Button на ваш взгляд с x:Name="Save", тогда Caliburn.Micro автоматически выведет ваш глагол Save на модель просмотра, когда нажимается кнопка, и автоматически включит и отключит кнопку при изменении значения свойства CanSave.