Если вы хотите управлять списком элементов из модели представления, тогда вам нужно использовать ItemsControl
вместо вставки элементов в StackPanel из кода кода. Внешний вид предметов можно изменить с помощью ItemsControl.ItemTemplate
. Действие по добавлению нового элемента должно быть инициировано командой, связанной с кнопкой:
<Window x:Class="XamlApp.MyWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MyWindow" WindowStartupLocation="CenterScreen"
Height="300" Width="300">
<Grid>
<ScrollViewer>
<ItemsControl ItemsSource="{Binding Path=MyItems}"
Margin="5"
Background="Wheat">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height=".9*" />
<RowDefinition Height=".1*" />
</Grid.RowDefinitions>
<TextBox Text="{Binding Path=MyText}" />
<Button Grid.Row="1"
Content="Create New UserControl"
FontSize="20"
Command="{Binding Path=DataContext.AddCmd,
RelativeSource={RelativeSource AncestorType=ItemsControl}}"
CommandParameter="{Binding}"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Grid>
</Window>
модель представления должна иметь коллекцию для хранения элементов и команду для добавления / вставки элементов:
public class StringItem
{
public string MyText { get; set; }
}
public class MyViewModel
{
public MyViewModel()
{
MyItems = new ObservableCollection<StringItem>();
AddCmd = new RelayCommand<StringItem>(Add);
}
public ObservableCollection<StringItem> MyItems { get; private set; }
public ICommand AddCmd { get; private set; }
private void Add(StringItem current)
{
var item = new StringItem { MyText = "new item " + (MyItems.Count + 1) };
int idx = MyItems.IndexOf(current);
if (idx < 0)
MyItems.Add(item);
else
MyItems.Insert(idx + 1, item);
}
}
RelayCommand является реализацией ICommand из этого легкого пакета MVVM
ViewModel и View соединены вместе в конструкторе View:
public partial class MyWindow : Window
{
public MyWindow()
{
InitializeComponent();
DataContext = new MyViewModel
{
MyItems = { new StringItem { MyText = "hello world" } }
};
}
}