Не обновляются кнопки с помощью MVVM и Autofac в Windows Phone 8

Я создаю небольшое приложение, основанное на MVVM и использующее Autofac в качестве инжектора зависимостей.

Я создал VMBase, от которого зависят все ViewModels, и я также использую VMLocator для внедрения всех зависимостей (используя Autofac, как указано выше).

public class VMLocator
{
    IContainer container;

    public VMLocator()
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<VMRetrieveInfo>();
        container = builder.Build();
    }

    public VMRetrieveInfo RetrieveInfoViewModel
    {
        get { return container.Resolve<VMRetrieveInfo>(); }
    }
}

Получил класс DelegateCommand, который обрабатывает Raises CanExecute:

    public void RaiseCanExecuteChanged()
    {
        if (this.CanExecuteChanged != null)
            this.CanExecuteChanged(null, new EventArgs());
    }

Моя проблема возникает, когда я пытаюсь поместить кнопку с помощью класса DelegateCommand, который меняет свое состояние с помощью метода CanExecute, который возвращает переменную, которая изменяется, когда я нажимаю другую кнопку. Изменение значения переменной, похоже, не запускает какое-либо событие, которое изменяет результат CanExecute (метод CanExecute даже не вызывается), и я довольно растерялся.

    public ICommand NavigateCommand
    {
        get { return navigateCommand; }
    }

    public void NavigateCommandExecute()
    {

    }

    public bool NavigateCommandCanExecute()
    {
        return canCallWS;
    }

Запуск аналогичного приложения без внедрения зависимостей (Autofac) работал у меня раньше.

Любая помощь?

Спасибо


person F.D.F.    schedule 19.12.2013    source источник


Ответы (1)


В классе DelegateCommand у вас есть событие CanExecuteChanged, точно так же, как вы использовали метод RaisePropertyChanged для запуска PropertyChanged в вашей базе ViewModel, вам нужно выполнить метод RaiseCanExecuteChanged в вашем классе DelegateCommand, чтобы запустить событие CanExecuteChanged при изменении условия. .

В WPF у нас есть CommandManager, который выполняет эту работу за нас без необходимости запускать событие. В Windows Phone нам нужно запустить событие. Это не проблема autofac или DI, это то, как команда может выполнять работу в Silverlight/Windows Phone.

Надеюсь это поможет!

person Josue Yeray    schedule 19.12.2013
comment
Спасибо, Джосу! приятно, что вы ответили ;-) - person F.D.F.; 19.12.2013
comment
Привет! Отлично, теперь, когда вы обновляете переменную/свойство canCallWS, вызываете RaiseCanExecuteChanged DelegateCommand, вы хотите обновить статус CanExecute, и вуаля! просто надо работать.... - person Josue Yeray; 19.12.2013
comment
Но разве это не должен быть автоматический звонок? Кажется, я помню, как он вызывался всякий раз, когда вы меняете переменную... - person F.D.F.; 19.12.2013
comment
Да, в WPF, а не в Silverlight/Windows Phone :( - person Josue Yeray; 19.12.2013