Idea is to create collection of buttons in user control.
So, first start new project (i.e. ItemsControl), and, for example, in same solution add new WPF User Control Library:
After enter XAML like:
<UserControl x:Class="MyItemsControl.MyItemsControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"> <Grid> <ItemsControl ItemsSource="{Binding MyTest}"> <ItemsControl.ItemTemplate> <DataTemplate> <Button Content="Test"/> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </Grid> </UserControl>
Notice line:
<ItemsControl ItemsSource="{Binding MyTest}">
MyTest property will be hidden in another class (SomeAnotherClass), not in the main datacontext, which I will explain later.
Now, save, and build the solution. In main project (ItemsControl), in references add your user control (MyItemsControl):
Write XAML like:
<Window x:Class="ItemsControl.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:myItemsControl="clr-namespace:MyItemsControl;assembly=MyItemsControl" Title="MainWindow" Height="350" Width="525"> <Grid> <myItemsControl:MyItemsControl DataContext="{Binding MyDataContext}"/> </Grid> </Window>
Notice line:
<myItemsControl:MyItemsControl DataContext="{Binding MyDataContext}"/>
In code behind of main project (ItemsControl) I wrote something like:
public MainWindow() { ItemsControlViewModel icvm; icvm = new ItemsControlViewModel(); this.DataContext = icvm; InitializeComponent(); }
Then class ItemsControlViewModel looks like:
public class ItemsControlViewModel { public SomeAnotherClass MyDataContext { get; set; } public ItemsControlViewModel() { MyDataContext = new SomeAnotherClass(); } }
Notice that here I created MyDataContext as a property, and I referenced that class to another class (SomeAnotherClass) which looks like:
public class SomeAnotherClass { public IEnumerable<string> MyTest { get; set; } public SomeAnotherClass() { MyTest = new[] { "test" }; } }
Here notice:
public IEnumerable<string> MyTest { get; set; }
Which is property called from my user control, also notice that is of the type IEnumerable, that is because it is binded to ItemsControl.
Here you can download example.