То, что вы пытались реализовать, не соответствует шаблону MVVM.Для начала вам нужно позаботиться о 3 вещах:
- ViewModels
- Инициализация ViewModel, привязанного к окну
- Привязка ViewModel к пользовательскому интерфейсу в XAML
ViewModels:
Создайте модель представления, которая будет привязана к вашему MainWindow, и создайте наблюдаемую коллекцию внутри этого MainWindowViewModel, которая содержит список объектов, которые будут содержать данные, которыеможет использоваться в пользовательском интерфейсе:
public ObservableCollection<LayoutDocumentViewModel> LayoutDocument {get;set;}
Убедитесь, что и MainWindowViewModel, и LayoutDocumentViewModel наследуют от INotifyPropertyChanged ( Реализация уведомления об изменении свойства ) или если вы используете MVVMLight (или аналогичный) изViewModelBase.
LayoutDocumentViewModel - это просто ViewModel, который будет использоваться для хранения информации о вашем документе макета и может быть привязан к пользовательскому интерфейсу.
public LayoutDocumentViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName]
string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
// Call OnPropertyChanged whenever the property is updated
OnPropertyChanged("Name");
}
}
}
Я настоятельно рекомендую вам использоватьMVVMLight (или аналогичный) или поместите код INotifyPropertyChange в базовый класс, т.е. ViewModeНапример,
Для простоты в этом примере я инициализирую наблюдаемую коллекцию и создаю несколько объектов макетов документов непосредственно в MainWindowViewModel, но вам нужно изучить это дальше и выяснить, где он находится.Вам подходит для их инициализации и / или создания.
public MainPageViewModel () {DocumentLayouts = new ObservableCollection ();DocumentLayouts.Add (new DocumentLayout {Name = "Layout1"});DocumentLayouts.Add (new DocumentLayout {Name = "Layout2"});}
Выше описано, как создать MainWindowViewModel и документы макета.
Инициализация MainViewModel (и привязка к MainWindow.xaml).Обратите внимание, что это быстрый и грязный способ начать работу, и вам действительно следует изучить контейнеры IoC.
<Window.DataContext>
<local:MainWindowViewModel/>
</Window.DataContext>
Наконец, свяжите свой ViewModel & UI
XAML:
<Grid>
<ItemsControl ItemsSource="{Binding LayoutDocuments}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Label Content="{Binding Name}"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
Примечание. Просто замените метку элементом управления LayoutDocument и привяжите его к соответствующим свойствам элемента, которые вы объявили в LayoutDocumentViewModel.
Надеюсь, это поможет вам начать.