Не удается связать данные во время разработки в WPF с использованием MVVM - свойство ViewModel никогда не вызывается - PullRequest
4 голосов
/ 18 февраля 2010

Хорошо, я причесываюсь, так что любая помощь будет очень признательна!

Я создаю приложение WPF с использованием шаблона MVVM.

В попытке получить данные во время разработки я использую инфраструктуру внедрения зависимостей Ninject в сочетании с локатором службы (очень похоже на пример в статье http://jonas.follesoe.no/YouCardRevisitedImplementingDependencyInjectionInSilverlight.aspx

(поскольку я использую WPF, а не Silverlight, я проверяю свойства времени разработки немного по-другому, но в остальном считаю, что это применимо).

Я не могу заставить его работать во время разработки, независимо от того, что я делаю, привязка, кажется, даже не вызывается. Работает нормально во время выполнения.

Вот код для моего модуля Ninject:

public class ViewModelModule : StandardModule
{
    public override void Load()
    {
        bool isRuntime = !ViewModelBase.IsInDesignMode;

        if (isRuntime)
        {
            Bind<IViewModel>().To<MyViewModel>();                
        }
        else
        {
            Bind<IViewModel>().To<MyDesignTimeViewModel>();
        }
    }
}

MyDesignTimeViewModel - это простой объект CLR, который возвращает жестко закодированные данные вместо всех одинаковых свойств в MyViewModel.

Сервисный локатор выглядит следующим образом:

 public class ViewModelLocator
 {
    private static IKernel kernel;

    static ViewModelLocator()
    {
        if (kernel == null)
        {
            kernel = new StandardKernel(new ViewModelModule());
        }
    }      

    public IViewModel ViewModel
    {
        get
        {
            var vm = kernel.Get<IViewModel>();
            return vm;
        }
    }
}

И XAML связывает DataContext страницы следующим образом (хотя я пробовал несколько разных способов объявить его, все с одинаковым результатом):

<Page.DataContext>
    <Binding Source="{StaticResource viewModelLocator}" Path="ViewModel" />        
</Page.DataContext>

(где viewModelLocator объявлен в ResourceDictionary, который объединен в верхней части этого файла).

Как я уже сказал, это прекрасно работает во время выполнения, даже если я переключаю свою привязку Ninject для использования MyDesignTimeViewModel во время выполнения, она успешно отображает фиктивные данные. У меня есть фиктивный конвертер в одной из моих привязок, чтобы увидеть, что происходит, и это вызывается во время выполнения, но не во время разработки (я весь день отчаянно отлаживал экземпляр времени разработки, используя отдельный процесс Visual Studio, так как согласно рекомендациям MSDN!)

Во время разработки связывание Ninject выполняется вместе с созданием ядра. Затем вызывается viewModel, и он возвращает DesignTimeViewModel вместе со всеми моими жестко закодированными данными. Но фактическая привязка к любому из свойств в модели представления никогда не вызывается (фиктивная точка останова преобразователя никогда не срабатывает).

Я действительно не вижу, что я делаю неправильно. Любые указатели в любом направлении будут с благодарностью, так как на этом этапе я просто сбит с толку. Спасибо:)

Ответы [ 2 ]

1 голос
/ 18 февраля 2010

Вот пара вещей, которые нужно попробовать:

  1. Пока вы отлаживаете конструктор, проверьте, есть ли у вас какие-либо предупреждения / ошибки.
  2. Попробуйте отследить вашего конструктора с помощью последнейверсия Snoop , которая позволяет подключаться к Visual Studio.
  3. Попробуйте отладить привязки .Может быть, что-то интересное выходит.

И не забудьте проверить DataContexts :).

Надеюсь, что хоть что-то поможет.

Приветствия

0 голосов
/ 10 июля 2010

Может быть, вам подойдут новые функции Visual Studio 2010 и Expression Blend 4 во время разработки.

Как это работает, показано в BookLibrary примере приложения WPF Application Framework (WAF) . Пожалуйста, загрузите версию .NET4.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...