Бутоните не се актуализират с помощта на 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, който обработва повдигания на 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
Благодаря Josue! радвам се, че ти отговаряш ;-) - 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