WPF просто Grid Binding

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

<Grid x:Name="Screen" Grid.Row="1" Grid.ColumnSpan="4" Margin="20"></Grid>
List<int> mass = new List<int>();
List<Label> numbs = new List<Label>();
private void GenerateNumb(object sender, RoutedEventArgs e)
        {
            Random rnd = new Random();
            Screen.Children.Clear();
            mass = new List<int>();
            if (numberstring.Text.Length==0)
            {
                return;
            }
            int c = Convert.ToInt32(numberstring.Text);
           
            for (int i=0;i<c; i++)
            {
                mass.Add(rnd.Next());
                ColumnDefinition c1 = new ColumnDefinition();
                Screen.ColumnDefinitions.Add(c1);
                numbs.Add(new Label());
                Screen.Children.Add(numbs[i]);
                Grid.SetColumn(numbs[i], i);
                numbs[i].Content = mass[i];
            }
        }

Немного другой код

<ItemsControl ItemsSource="{Binding Buttons}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <UniformGrid Columns="3" Rows="3"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
class MainWindowViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName]string prop ="") 
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
        }


        public List<ButtonViewModel> _Buttons { get;  set; } = new List<ButtonViewModel>();
        public List<ButtonViewModel> Buttons
        {
            get
            {
                return _Buttons;
            }
            set
            {
                _Buttons = value;
                OnPropertyChanged();
            }
        }



        public class ButtonViewModel
        {
            public string Text
            {
                get;
                set;
            }

            public ICommand Command { get; set; }

            public ButtonViewModel(string text)
            {
                Text = text;
            }
        }









        public MainWindowViewModel()
        {
            Buttons.Add(new ButtonViewModel("1"));
            Buttons.Add(new ButtonViewModel("2"));
            Buttons.Add(new ButtonViewModel("3"));
            Task.Factory.StartNew(() =>
            {
                while (true)
                {
                    Task.Delay(1000).Wait();
                    var Mytmp= Buttons[1];
                    Buttons[1] = Buttons[0];
                    Buttons[0] = Mytmp;
                }
            });
        }
    }

Ответы (1 шт):

Автор решения: aepot

Как-то так это делается.

Верстку каждого элемента коллекции через ItemTemplate, а контрол, который будет служить контейнером - через ItemsPanelTemplate задается, можно использовать любую разновидность панели. То что вы ищете - это возможно UniformGrid (ссылка).

<ItemsControl ItemsSource="{Binding MyCollection}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid>
                <local:MyControl Text="{Binding ...}" .../>
            <Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemControl>
→ Ссылка