Создание модели ViewModel (требуется простая помощь) - PullRequest
2 голосов
/ 05 марта 2012

Новичок в MVVM, он работает, но у меня, похоже, пробел в знаниях / концепциях ...

Мое главное окно отображает список элементов:

<Window.DataContext>
    <vm:MainWindowViewModel />
</Window.DataContext>

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
        <RowDefinition Height="100" />
    </Grid.RowDefinitions>

    <vw:HeaderView Grid.Row="0" />

    <vw:RegistersView Grid.Row="1" />

    <vw:LogView Grid.Row="2" />
</Grid>

MainWindowViewModel создает основной репозиторий данных.

RegistersView имеет ListView объектов (среди прочего) и отвечает за редактирование значений. Я могу получить данные в ListView в RegistersView, выставив ObservableCollection <> и изменив вышеприведенную строку на

<vw:RegistersView DataContext="{Binding PropertyNameOfCollectionForListView}" Grid.Row="1" />

Кажется, очень MVVM (не говоря уже о том, что он очевиден) также создает ViewModel для RegistersView ... но мне не хватает понимания того, как его подключить самым простым способом. Я понимаю, что я могу использовать IOC / DI, используя Unity, Prism и все остальные, но ... у меня есть для? На самом деле все, что я хочу - это иметь возможность выставлять определенные свойства Registers-View для взаимодействия с моделью и определять команды для привязки и т. Д.

Я чувствую, что хочу сказать

<vw:RegistersView viewmodel="RegistersViewModel(PropertyNameOfCollectionForListView)" />

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

Спасибо за ваше терпение; ->

Ответы [ 2 ]

0 голосов
/ 05 марта 2012

Кажется, очень MVVM (не говоря уже об очевидности) также создает ViewModel для RegistersView

Я полностью согласен, это очень похоже на MVVM. Так что в настоящее время ваш MainWindowViewModel выглядит следующим образом:

class MainWindowViewModel
{
  public ObservableCollection<RegisterViewModel> PropertyNameOfCollectionForListView {get; set;}
}

Почему бы не создать модель представления, которая инкапсулирует коллекцию элементов, доступных для вашего пользовательского интерфейса, вместе со своими командами. Итак, новая модель представления может выглядеть так:

public class RegistersViewModel
{
  public ObservableCollection<RegisterViewModel> RegisterViewModelCollection {get; set;}

  public ICommand AddRegister { get; set; }

  public ICommand RemoveRegister { get; set; }
}

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

Ваш MainWindowViewModel теперь предоставляет эту новую модель представления:

class MainWindowViewModel
{
  public RegistersViewModel RegistersViewModelProperty {get; set;}
}

Затем вы привязываете свой usercontrol к этому свойству:

И в XAML для этого пользовательского элемента управления привязка к списку и командам

<UserControl x:Class="RegistersView" ... >
   <ListView ItemsSource={Binding Path=RegisterViewModelCollection}/>
   <Button Content="Add" Command="{Binding Path=AddRegister}"/>
</UserControl>

И нет, для этого не нужны никакие DI или IoC!

0 голосов
/ 05 марта 2012

Ваш MainWindowViewModel может предоставить свойство типа RegistersViewModel, а затем вы можете связать его с RegisterView.DataContext в XAML, как показано ниже:

<vw:RegistersView Grid.Row="1" 
                  DataContext="{Binding RegistersViewModelPropertyName}" />

Очевидно, RegistersViewModelPropertyName должно ссылаться на уже созданный экземплярRegistersViewModel.Вам решать, как это сделать, либо на MainViewModel этапе строительства, либо реализовать RegistersViewModelPropertyName getter как ленивый.

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