MVVM доступ к элементу другого представления из viewModel - PullRequest
2 голосов
/ 22 сентября 2011

Я начал работать с шаблоном MVVM в новом проекте. Все хорошо, но я пришел к следующей проблеме. Реализация выглядит так: У меня есть MainView, главное окно приложения. В этом окне у меня есть Telerik RadGroupPanel, в котором я размещаю остальные виды приложений в виде вкладок. Остальные viewModels не знают об этом RadGroupPanel, который размещен в MainVIew. Как я должен правильно добавить эти представления в RadGroupPanel из команд в моделях представления? Спасибо.

Ответы [ 2 ]

1 голос
/ 21 декабря 2011

Рассматривали ли вы внедрение своего представления в ViewModel с использованием интерфейса для поддержания разделения?Я знаю, что это нарушает MVVM, но я успешно использовал это в ряде проектов WPF.Я называю это MiVVM или модель с интерфейсом для просмотра ViewModel .

Шаблон прост.Ваш Usercontrol должен иметь интерфейс, назовите его IView.Затем в ViewModel у вас есть свойство с установщиком типа IMyView, скажем

public IMyView InjectedView { set { _injectedView = value; } }

Затем в представлении вы создаете свойство зависимостей с именем This

public MyUserControl : IMyView
{
    public static readonly DependencyProperty ThisProperty = 
         DependencyProperty.Register("This", typeof(IMyView), typeof(MyUserControl)); 

    public MyUserControl() 
    {
       SetValue(ThisProperty, this);
    } 
    public IMyView This { get { return GetValue(ThisProperty); } set { /* do nothing */ } } 
}

наконец, в Xaml вы можете внедрить представление непосредственно в ViewModel, используя привязку

<MyUserControl This="{Binding InjectedView, Mode=OneWayToSource}"/>

Попробуйте!Я использовал этот шаблон много раз, и вы получаете интерфейс к представлению, внедренному один раз при запуске.Это означает, что вы поддерживаете разделение (Viewmodel можно протестировать, так как IView можно смоделировать), но вы обошли отсутствие поддержки связывания во многих сторонних элементах управления.Плюс, это быстро.Знаете ли вы, связывание использует отражение?

Существует демонстрационный проект, демонстрирующий эту модель в ссылке на блог выше.Я бы рекомендовал опробовать реализацию MiVVM с присоединенным свойством, если вы используете сторонний контроль.

0 голосов
/ 22 сентября 2011

Вы можете иметь список моделей представления, для которых вам нужно добавить элементы управления в ObservableCollection в вашей модели представления главного окна.Затем вы можете привязать ItemsSource RadGroupPanel к этой коллекции и использовать ItemTemplateSelector и ContentTemplateSelector RadGroupPanel, чтобы выбрать правильный шаблон для использования на основе связанной модели представления.

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