2013-06-19 3 views
3

Первый раз, когда вы пытаетесь MVVM, ищите ясность в том, где разместить код.Ищете руководство по размещению кода в приложении WPF MVVM.

Моему главным видом нужно будет привязать к списку, который будет содержать 1 для многих UserControls.

Будет ли список в модели ViewModel или модели? Из того, что я читаю, модель содержит свойства, которые, как правило, вид связывается с помощью ViewModel. Я не вижу, как это сработает для этого, Model не нужно будет знать о List of UserControls, который является списком View (UserControl), я могу сделать это сложнее, чем нужно, но я все еще обертываю мой разум вокруг, где должен быть размещен код, и я хочу его понять. Спасибо за любые рекомендации, или если я не очень хорошо объясню, пожалуйста, дайте мне знать.

+7

Нет, Просмотр никогда не должны привязаться к списку управления. У вашей виртуальной машины должен быть список элементов виртуальной машины и привязка элемента ItemsControl к этому. –

ответ

7

Ваш UserControls должен иметь ViewModel (назовем его ItemViewModel).

Ваша модель MainView должна иметь номер ObservableCollection<ItemViewModel>.

Тогда ваш вид должен иметь ItemsControl (или одного из его производных, таких как ListBox), для которых свойство ItemsSource будет связан с ObservableCollection. И тогда ItemsControl должен определить ItemTemplate, содержащий UserControl.

Это правильный способ сделать то, что вы описываете с помощью WPF/MVVM.

Пример (псевдокод):

MainViewModel:

public class MainViewModel 
{ 
    public ObservableCollection<ItemViewModel> Items {get;set;} 
} 

MainView:

<Window> 
    <ItemsControl ItemsSource="{Binding Items}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
      <my:UserControl/> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</Window> 

Имейте в виду, что каждый экземпляр UserControl будет иметь это DataContext набор к соответствующему элементу в сборник источников.

Поэтому, если ваш ItemsViewModel выглядит примерно так:

public class ItemsViewModel 
{ 
    public string LastName {get;set;} 
    public string FirstName {get;set;} 
    //INotifyPropertyChanged, etc. 
} 

ваш UserControl может быть определена следующим образом:

<UserControl> 
    <StackPanel> 
     <TextBox Text="{Binding LastName}"/> 
     <TextBox Text="{Binding FirstName}"/> 
    </StackPanel> 
</UserControl> 
+0

Спасибо, это действительно очистило это для меня. Я ценю ваш ответ. – user1904898

2

Вам не нужен список UserControls. Вероятно, у вас есть привязка View к списку элементов в ViewModel. Например, создайте ListBox и установите его в ItemsSource в список ViewModel.

Чтобы создать свой пользовательский элемент управления для каждого элемента, вам необходимо создать DataTemplate для типа в вашем списке и указать свой UserControl, и вы можете дать любые привязки внутри этого пользовательского элемента управления к элементу.

Затем ListBox использует DataTemplate для создания UserControl для каждого элемента в списке.

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