2013-04-26 2 views
0

Я пытаюсь динамически изменять UserControl виды, которые определены в ObservableCollection.Динамические представления в WPF

public class MItem : INotifyPropertyChanged 
    { 
     private UserControl _mView; 
     public UserControl MView 
     { 
      get { return _mView; } 
      set 
      { 
       if (_mView != value) 
       { 
        _mView = value; 
        OnPropertyChanged("MView"); 
       } 
      } 
     } 

... 
     } 

В отдельном окне у меня есть:

ObservableCollection<MItem> _items = new ObservableCollection<MItem>; 

_items.Add(new MItem{MView = MyView}); 

Очевидно, что когда речь идет о создании нового объекта этой точки зрения, а затем назначить ее ребенку на сетке приходит, чтобы быть проблема - это Я дам ошибку типа.

Я пытался что-то вроде:

_items[0].MView = new UserControl(); // I know this wouldn't work 

Мой главный вопрос, кто-нибудь пытался реализации что-то вроде этого, и как вы получите вокруг него?

Благодаря

+1

Это противоречит всем, что означает MVVM. У вас не должно быть ссылок на какие-либо элементы пользовательского интерфейса в 'ObservableCollection'. Создайте 'ObservableCollection ' вместо этого, а затем используйте надлежащие 'DataTemplates', чтобы отобразить их на экране. –

ответ

9

Как указывает @HighCore, WPF позволяет значительно лучший способ динамического определения того, что представление для отображения, сохраняя при этом разделение задач, так что вы не смешиваясь вид логики с бизнес-логикой. И MVVM - это проверенный и проверенный метод выполнения этого.

По существу, вы хотите создать ViewModel для каждой «вещи», которую вы хотите отобразить. Затем вы создаете DataTemplate для каждой ViewModel, которая является представлением. DataTemplate может быть автономным, или он может просто указывать на UserControl. Затем вы используете ContentPresenter, который является DataBound, к свойству CurrentItem или что-то еще, и когда вы устанавливаете CurrentItem на определенную ViewModel, WPF найдет подходящий для вас номер (Вид) и отобразит его соответствующим образом.

В Интернете есть несколько пошаговых инструкций, которые демонстрируют это, а также есть несколько примеров этого шаблона на StackOverflow. Один пример, который, похоже, очень точно соответствует тому, что вы просите, находится здесь: Switching between Views/UserControls using MVVM.

+0

Спасибо Брайан, который помогает мне понять, как мое решение будет работать ** надлежащим образом. –

+0

@BrianS +1. Я слишком ленив, чтобы объяснить все это прямо сейчас. –

+0

@BrianS Взяв пример из статьи, которую вы поделили, если в окне с ContentPresenter есть ViewModel и что ContentPresenter отвечает за отображение Views (каждый со своими собственными ViewModels): 1) Может ли ViewModel Window получить/установить информацию на отображаемом Viewmodel View? 2) Если да, как бы «поговорить» с отображаемой ViewModel View? –

Смежные вопросы