Мне нужен контроллер представления для MVVM-света в Silverlight?

У меня есть следующий вопрос относительно светового сигнала MVVM: что "управляет" UI? Я вижу, что у меня может быть ViewModel на Представление, которое я показываю; ViewLocator обрабатывает весь ViewModels (для кэширования, как я понимаю). Но что управляет UI?

Если мне определили Команду в моем ViewModel, который заявляет "ShowDetail"; я должен написать код для отображения этого Представления в ViewModel?

Есть ли какие-либо примеры этого?Спасибо!

6
задан Stefan de Vogelaere 19 April 2010 в 05:34
поделиться

5 ответов

В MVVM «движущей силой» представления является привязка данных. Вы можете подключить View к ViewModel, установив DataContext View так, чтобы он указывал на модель представления.

Простой пример (с использованием MVVM Light):

MyViewModel.cs

public class MyViewModel : ViewModelBase
{
   (...)
   private string _myProperty;
   public string MyProperty {
       get { return _myProperty; }
       set {
           _myProperty = value;
           RaisePropertyChanged("MyProperty");
       }
   }
}

MyView.xaml.cs

void MyView() {
   DataContext = new MyViewModel();
}

MyView.xaml

<TextBlock Text="{Binding MyProperty}" />
1
ответ дан 17 December 2019 в 00:06
поделиться

Сам по себе шаблон MVVM не имеет ничего особенного для навигации между представлениями. Хотя для этого есть много решений в нескольких фреймворках. Наиболее распространенное решение - использовать какой-то контроллер, который "оркестрирует" основное представление, или использовать подход "Master-Detail" для вложенных представлений.

Некоторые интересные решения:

5
ответ дан 17 December 2019 в 00:06
поделиться

Я создал шаблон T4, который генерирует код и показывает, как перейти к uri или объекту или закрыть окно (wpf). Он работает с mvvm light

Загрузите здесь

1
ответ дан 17 December 2019 в 00:06
поделиться

Думаю, вы могли бы попробовать Cinch V2:

http://www.codeproject.com/KB/WPF/CinchV2_1.aspx

, что кажется довольно многообещающим. Однако я думаю, что большинство этих фреймворков довольно сложны.

Я реализовал решение с простым подходом MVVM с каким-то шаблоном контролирующего контроллера, который управляет обменом данными между представлениями и моделями представлений.

0
ответ дан 17 December 2019 в 00:06
поделиться

Я бы порекомендовал вам ознакомиться с системой обмена сообщениями в наборе инструментов MVVM light. Это, кажется, самый простой подход, который я нашел для достижения этой цели.Вот пример того, как это работает:

Если у вас есть 2 модели просмотра - одна для поиска клиентов, другая для отображения сведений о выбранном клиенте:

В первой модели просмотра у вас есть такое свойство:

public string CustomerID
    {
        get
        {
            return _customerid;
        }

        set
        {
            if (_efolderid == value)
            {
                return;
            }

            var oldValue = _customerid;
            _customerid = value;

            // Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging
            RaisePropertyChanged("CustomerID", oldValue, value, true);
        }
    }

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

    void registerForMessages()
    {
        Messenger.Default.Register<PropertyChangedMessage<string>>(this,
            (pcm) =>
            {
                if (pcm.PropertyName == "CustomerID")
                {
                    customerID = pcm.NewValue;
                    AddWorkplanCommand.RaiseCanExecuteChanged();
                    loadCustomerDetails();
                }
            });
    }

Обязательно вызовите функцию registerForMessages () в конструкторе второй модели представления. Еще одна полезная вещь - создание своеобразной карты, если в вашем приложении 4 или более ViewModels. Я считаю, что легко создать его в быстром текстовом файле в решении, чтобы отслеживать все сообщения и то, для чего они предназначены, а также какие другие модели представления зарегистрированы для их получения.

Одна из действительно хороших вещей в этом заключается в том, что у вас есть одна модель просмотра, отправляющая уведомление об изменении, например, об изменении свойства customerID, и сразу же 4 другие модели просмотра получают это изменение и все начинают загружать изменения сами.

0
ответ дан 17 December 2019 в 00:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: