2011-04-05 14 views
18

He estado jugando con el marco de Caliburn Micro MVVM y tengo algunos problemas con los métodos de protección.Caliburn Micro Guard Métodos no evaluados en el cambio de propiedad

que tienen una vista de modelo:

public class MyViewModel : PropertyChangedBase, IMyViewModel 

Una propiedad:

public DateTime? Date 
{ 
    get{return this.date; } 
    set 
    { 
     this.date = value; 
     this.NotifyOfPropertyChange(() => Date); 
    } 
} 

Además, tengo un método en mi modelo de vista con un método de protección

public void Calculate() 
{ 
    // ..some code.. 
} 

public bool CanCalculate() 
{ 
    return this.Date.HasValue; 
} 

Y una botón en mi opinión:

El problema que tengo es que el método CanCalculate se ejecuta al cargar, pero cuando ingreso valores en los campos de texto, no reevalúa el método CanCalculate. Estoy disparando el evento de propiedad cambiada al establecer las propiedades del modelo de vista de datos, ¿cuál podría ser el problema?

+0

Podría mostrar el código para la vista, y también donde invoca el método NotifyOfPropertyChanged en su modelo de vista? – devdigital

+1

@devdigital ok He actualizado – Charlie

Respuesta

33

Ok, lo descubrí. No me di cuenta de que tienes que disparar la notificación del método de guardia, pensé que el marco lo hacía, pero tiene sentido.

así que cambio mi organismo a la propiedad:

public DateTime? Date 
{ 
    get 
    { 
     return this.date; 
    } 
    set 
    { 
     this.date = value; 
     this.NotifyOfPropertyChange(() => Date); 
     this.NotifyOfPropertyChange(() => CanCalculate); 
    } 
} 

y cambió mi método CanCalculate a una propiedad:

public bool CanCalculate 
{ 
    get 
    { 
     return this.Date.HasValue; 
    } 
} 

Y todo funciona bien ahora :)

+3

CanCalculate es un método que hizo para que funcione – GorillaApe

+3

Simplemente conviértalo en una propiedad booleana con un getter. –

+0

Para cualquier persona que intente hacer esto funcione para métodos de protección con parámetros: Si el objeto parámetro está contenido en otra propiedad (por ejemplo, una colección está vinculada a un cuadro de lista y el guardia es por elemento) puede notificar propiedad cambiado por la propiedad (aparentemente) irrelevante. –

0

Supongo que se llaman a través de un Command (algunos códigos pueden ayudar a los que llaman).

Si el caso que está teniendo es que desea que los comandos se revelen basados ​​en alguna entrada, debe invocar CommandManager.InvalidateRequerySuggested() para que se llamen a los comandos CanExecute s. Como el comando está vinculado al botón y no al cuadro de texto, no se actualizará. En su conjunto de propiedades (el que está vinculado al cuadro de texto), debe indicarle al marco que vuelva a consultar los comandos. Esto a su vez llamará a su método CanCalculate.

Si los métodos Calculate y CanCalculate no están asociados con un comando, lo anterior no ayudará.

+0

Caliburn Micro parece ignorar CommandManager.InvalidateRequerySuggested(), un poco de supervisión en realidad. :/ –

+3

No es un descuido. Caliburn.Micro no utiliza 'Commands' en absoluto, tiene' Actions'/'ActionMessages'. – mnn

2

Si no necesita el método CanExecute to be, porque no usará parámetros. Luego puede reescribirlo como propiedad con notificación estándar y solo getter. Y llame a PropertyChanged cuando considere el resultado del cambio de getter.

Cuestiones relacionadas