Как мне привязать StackPanel к моей ViewModel?
На мой взгляд, у меня есть это:
<TextBlock Text="{Binding Title}"/>
который привязывается к свойству Title моего ViewModel, и это просто и хорошо работает:
private string _title;
public string Title
{
get
{
return _title;
}
set
{
_title = value;
OnPropertyChanged("Title");
}
}
Однако мой ViewModel также имеет свойство "FormFields", которое представляет собой StackPanel, который содержит ряд других элементов UserControls:
private StackPanel _formFields;
public StackPanel FormFields
{
get
{
return _formFields;
}
set
{
_formFields = value;
OnPropertyChanged("FormFields");
}
}
Как мне связать это с моей точки зрения?
В ASP.NET был элемент PlaceHolder, я ищу что-то с той же функциональностью, например
КОД ПСЕВДО:
<PlaceHolder Content="{Binding FormFields}"/>
2 ответа
Во-первых, не надо. Вместо того, чтобы диктовать пользовательский интерфейс вашей виртуальной машины, вы должны диктовать данные (модель). Другими словами, тип свойства должен быть ObservableCollection<FormField>
, Тогда ваша точка зрения будет связана следующим образом:
<ItemsControl ItemsSource="{Binding FormFields}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
Это обычно определяется в .Resources
раздел родительского элемента. Т.е. Window.Resources
или же WrapPanel.Resources
,
Сказав это, вы можете использовать ContentPresenter
схватить StackPanel
и вставьте его в визуальное дерево:
<ContentPresenter Content="{Binding FormFields}"/>
Вы пытались использовать Border
или просто равнина Grid
?
<Border Content="{Binding FormFields}" />
Тем не менее, я ставлю под сомнение дизайн. Поля формы должны находиться в представлении, а представление должно быть указано в шаблоне данных, который создается в зависимости от типа модели представления. Я бы лично не делал то, что вы делаете в коде.
Приветствия.