Повторное использование видов и Viewmodel с MEF и Silverlight - PullRequest
1 голос
/ 21 февраля 2011

Вот что я хотел бы сделать:

У меня есть приложение Silverlight, использующее рамку навигации и MEF.(например: http://msdn.microsoft.com/en-us/magazine/gg535672.aspx) Это приложение состоит из набора кнопок. Каждое нажатие кнопки загружает представление и связанный с ним ViewModel.

В этих представлениях у меня есть список с элементами и когдаЯ нажимаю на каждый элемент, который обновляет своего рода вид в этом представлении.

Я хотел бы создать систему навигации: например, myapp.aspx # view1 / 2, где 2 фактически является элементомщелкнул в списке. Если я нажму одну из кнопок, она загрузит элемент по умолчанию и обновит весь вид, но когда я нажму на элемент, мне не хотелось бы обновлять весь вид, но только определенную частьпредставление (я не хочу создавать другой экземпляр представления и модели представления).

Моя проблема на самом деле в том, что я хотел бы получить лучшую методику для получения ссылки на существующее представление или модель представления, когда я 'm перейти на эту страницу, которая уже была загружена (например, из myapp.aspx # view1 / 2 в myapp.aspx # view1 / 3) (я планирую сделать это в BeginLoad класса ContentLoader) Если я получу режим просмотраЯ могу сделать то, что хочу, изменив, например, текущее свойство itemId, которое может обновить представление благодаря привязке.

Спасибо, davance, если у вас есть что предложить.

Ответы [ 2 ]

1 голос
/ 21 февраля 2011

Обычный подход заключается в использовании какой-либо формы Messenger для выполнения операций такого типа.Щелчок элемента может вызвать отправку сообщения с прикрепленным элементом.Рассматриваемая модель представления будет подписчиком и будет редактировать свои текущие настройки (т. Е. Это ItemId, что приведет к обновлению привязки).

Наиболее распространенные реализации обычно аналогичны Messengerсервис в МВВМ Лайт .

Здесь довольно легко накатить свои собственные, тем более, что вы уже используете MEF.Просто создайте сервис для обработки передачи сообщений и импортируйте его в обе конечные точки.

0 голосов
/ 22 февраля 2011

На самом деле, я бы предпочел использовать URI для навигации в моем приложении, когда я нажимаю на элемент, но если я использую URI, перезагружается все представление, а не конкретная часть, которую я хотел бы.

С мессенджером я не смогу использовать навигацию с URL в представлении, я думаю?Или же я не совсем понял, что вы мне предложили.

Алгоритм, который я хотел бы использовать:

  • navigate ("... asp # MyView1 / 1")
    • MyView1 - текущий вид?
      • да тогда я хотел бы получить модель представления текущего представления и изменить его свойство ItemId с помощью 1
      • нет, тогда представление будет создано

И я хотел бы реализовать этот алгоритм там: (это место, где создается представление для каждой навигации, в моем классе CompositionNavigationContentLoader)

   public IAsyncResult BeginLoad(Uri targetUri, Uri currentUri, AsyncCallback userCallback, object asyncState)
    {
        // Convert to a dummy relative Uri so we can access the host.
        var relativeUri = new Uri("http://" + targetUri.OriginalString, UriKind.Absolute);

        // Get the factory for the ViewModel.
        var viewModelMapping = ViewModelExports.FirstOrDefault(o => o.Metadata.Key.Equals(relativeUri.Host, StringComparison.OrdinalIgnoreCase));
        if (viewModelMapping == null)
            throw new InvalidOperationException(
                String.Format("Unable to navigate to: {0}. Could not locate the ViewModel.", targetUri.OriginalString));

        // Get the factory for the View.
        var viewMapping = ViewExports.FirstOrDefault(o => o.Metadata.ViewModelContract == viewModelMapping.Metadata.ViewModelContract);
        if (viewMapping == null)
            throw new InvalidOperationException(
                String.Format("Unable to navigate to: {0}. Could not locate the View.", targetUri.OriginalString));

        // Resolve both the View and the ViewModel.
        var viewFactory = viewMapping.CreateExport();
        var view = viewFactory.Value as Control;
        var viewModelFactory = viewModelMapping.CreateExport();
        var viewModel = viewModelFactory.Value as IViewModel;

        // Attach ViewModel to View.
        view.DataContext = viewModel;
        viewModel.OnLoaded();

Спасибо.

...